Язык Форт и его реализации



             

Инфиксная запись формул - часть 2


По аналогии со словами >R, R@ и R> определим слова для работы со стеком ОПРЦ:

: >ОПРЦ ( A --->) ОПРЦ @ ! 2 ОПРЦ +! ; : ОПРЦ@ ( ---> A) ОПРЦ @ 2- @ ; : ОРПЦ> ( ---> A) ОПРЦ@ -2 ОПРЦ +! ;

Обработка операций в инфиксной форме состоит в том, что операция не выполняется, а помещается вместе со своим приоритетом на стек операций, выталкивая из него на исполнение все операции с меньшим или равным приоритетом. В состоянии исполнения вытолкнутая операция исполняется, а в состоянии компиляции — компилируется. Предполагая, что в стеке ОПРЦ сначала размещается адрес поля кода для исполнения операции, а за ним приоритет, определим слово для такого выталкивания операций:

: >ОПРЦ> ( N:ПРИОРИТЕТ---> ) >R BEGIN ОПРЦ@ R@ < NOT WHILE ОПРЦ> DROP ОПРЦ> ( CFA) STATE @ IF , ELSE EXECUTE THEN REPEAT R> DROP ;

Теперь введем определяющие слова для двухместных и одноместных операций и переопределим через них стандартные арифметические форт-слова:

: 2-ОП ( N:ПРИОРИТЕТ-&gt) &gtIN @ &gtR ' ( N,CFA) R&gt &gtIN ! CREATE IMMEDIATE ( N,CFA) , , DOES&gt ( PFA-&gt) 2@ ( N,CFA) &gtR &gtR R@ &gtОПРЦ&gt R&gt R&gt &gtОПРЦ &gtОПРЦ ; : 1-ОП ( -&gt) 9 2-ОП ; 2 2-ОП OR 2 2-ОП XOR 3 2-ОП AND 4 2-ОП = 5 2-ОП < 5 2-ОП > 6 2-ОП + 6 2-ОП - 7 2-ОП * 7 2-ОП / 7 2-ОП MOD 1-ОП NOT 1-ОП ABS 1-ОП NEGATE

В определении слова 2-ОП используется то обстоятельство, что код для исполнения данной операции обозначается словом, которое этим определяющим словом переопределяется. Поэтому перед тем как его имя будет выбрано из входного потока словом CREATE, текущая позиция во входном потоке запоминается на стеке возвратов и после исполнения слова ' (штрих) вновь устанавливается в то же положение для исполнения слова CREATE.

Переопределенные слова получают признак немедленного исполнения, чтобы описанные действия по переупорядочиванию вычислений выполнялись и во время компиляции, компилируя нужную последовательность операций.


Содержание  Назад  Вперед