В заключение осталось переопределить круглые
В заключение осталось переопределить круглые скобки, явно задающие порядок вычислений:
: ( 0 >ОПРЦ ; IMMEDIATE : ) 1 >ОПРЦ> ОПРЦ> 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
Слово
:= кладет на стек
ОПРЦ ограничитель для выталкивания операций и устанавливает переменную
?ЗНАЧ на обработку правой части присваивания. Слово
; выталкивает со стека
ОПРЦ все накопившиеся там операции, в результате на вершине стека данных оказывается значение правой части. Непосредственно под ним располагается адрес переменной, оставленный левой частью данного присваивания.
Содержание Назад Вперед