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



             

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


В заключение осталось переопределить круглые скобки, явно задающие порядок вычислений:

: ( 0 &gtОПРЦ ; IMMEDIATE : ) 1 &gtОПРЦ&gt ОПРЦ&gt DROP ; IMMEDIATE

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

Развивая описанную надстройку дальше, определим простой входной язык с описаниями переменных и присваиваниями, которые записываются обычным образом. В качестве знака присваивания пусть используется слово :=, а в качестве разделителя операторов — слово ;. Если переменная использована как получатель присваивания (слева от знака :=), то ее исполнение оставляет на стеке адрес значения; а если данная переменная входит в правую часть присваивания, то ее исполнение кладет на стек само значение данной переменной. Для управления поведением переменных нашего языка введем рабочую переменную ?ЗНАЧ, которая имеет значение 0 при обработке левой части присваивания и значение -1 при обработке правой, и определим слово ПЕРЕМ для описания переменных нашего языка:

VARIABLE ?3НАЧ : ПЕРЕМ CREATE 0 , DOES> [COMPILE] LITERAL ?ЗНАЧ @ IF STATE @ IF COMPILE @ ELSE @ THEN THEN ; IMMEDIATE

Для записи присваиваний определим слова := и ; через уже определенные скобки:

: := [COMPILE] ( -1 ?3НАЧ ! ; IMMEDIATE : ; [COMPILE] ) STATE @ IF COMPILE SWAP COMPILE ! ELSE SWAP ! THEN 0 ?ЗНАЧ ! ; IMMEDIATE

Слово := кладет на стек ОПРЦ ограничитель для выталкивания операций и устанавливает переменную ?ЗНАЧ на обработку правой части присваивания. Слово ; выталкивает со стека ОПРЦ все накопившиеся там операции, в результате на вершине стека данных оказывается значение правой части. Непосредственно под ним располагается адрес переменной, оставленный левой частью данного присваивания.


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