адресов компиляции этих ветвей в соответствии с их порядковыми
номерами строится вектор-переключатель, и нужная
98
ветвь выбирается по порядковому номеру. Определяющее слово SWITCH (переключатель) компилирует
такой вектор в поле параметров определяемого слова
и задает выбор альтернативы в исполняющей части:
Создающая часть строит новую словарную статью и
переключает текстовый интерпретатор в состояние компиляции. Таким образом, следующие слова будут компилироваться в поле параметров определяемого слова.
Слово SMUDGE выставляет разряд «Не готов» в байтесчетчике поля имени, делая данную статью «невидимой»
при поиске слов в словаре. Этот разряд будет сброшен
словом ; (точка с запятой), которое завершает компиляцию такого переключателя. Например:
Порядок использования переключателя ДЕНЬНЕДЕЛИ иллюстрирует следующий протокол работы:
Описанный механизм аналогичен определению вектора,
рассмотренному в п. 1.10. Его также можно задавать
по-разному в зависимости от конкретных требований.
В приведенной реализации неправильное значение выбирающего условия (выходящее за диапазон от 1 до 7)
приведет к непредсказуемому результату, поскольку
соответствующий контроль отсутствует. Чтобы ввести
его в реализацию, нужно каким-то образом подсчитать
число скомпилированных ссылок при завершении компиляции. Для этого можно применить способ, аналогичный компиляции переходов в шитом коде, введя
вместо точки с запятой специальное слово, отмечающее конец переключателя.
4*
99
Для реализации конструкции выбора через вложенные условные операторы создаются специальные слова,
которые обрамляют всю конструкцию и каждую ее
ветвь. В этом случае ветвь является обычной последовательностью форт-слов, аналогичной части «то» или
части «иначе» условного оператора. Как и в случае
условного оператора, конструкцию выбора можно использовать только внутри определений через двоеточие,
т. е. в состоянии компиляции текстового интерпретатора. При этом все ее специальные слова имеют признак
немедленного исполнения и компилируют необходимые
проверки и переходы.
Слова CASE (выбор) и ENDCASE (конец выбора)
ограничивают конструкцию и обеспечивают правильную компиляцию вложенных операторов. Слово CASE ,
проверив, что текстовый интерпретатор находится в состоянии компиляции, сменяет глобальную переменную
CSP (сокращение от CURRENT STACK POINTER —
текущий указатель стека), сохраняя на стеке ее прежнее значение (слово !CSP засылает в переменную CSP
адрес текущей вершины стека). Слова OF (из) и ENDOF (конец из) ограничивают отдельную ветвь. Во время работы скомпилированного определения перед началом исполнения каждой ветви на стеке лежат два
значения: число, представляющее условие выбора, и номер данной ветви. Слово OF компилирует текст OVER =
100
= IF DROP , который обеспечивает передачу управления на данную ветвь, если эти два значения совпали,
причем в этом случае они оба снимаются со стека. Если
же значения оказались разными, то управление передается на текст, следующий за словом ENDOF для
данной ветви, которое эквивалентно слову ELSE . Наконец, слово ENDCASE компилирует операцию DROP ,
чтобы снять со стека оставшееся там значение условия,
и разрешает все накопившиеся на стеке выходы из ветвей на текущую точку, исполняя для этих ветвей слово
THEN . Его последним действием является восстановление прежнего значения переменной CSP , которое
к этому моменту оказывается на вершине стека.
В приведенных определениях можно несколько
уменьшить объем кода, компилируемого для входа
в каждую ветвь, если ввести для этого специальное
слово, вслед за которым в шитый код компилируется
адрес перехода на следующую ветвь:
Исполнение слова (OF) аналогично ?BRANCH , в зависимости от условия оно переустанавливает указатель
интерпретации, либо обходя скомпилированную за ним
ссылку, либо устанавливая указатель по значению этой
ссылки. Аналогичным образом наряду со словами (OF)
и ОФ можно определить пары ( < O F ) и < O F , (> OF)
и > OF , ( < O F < ) и
Последние комментарии
1 час 43 минут назад
9 часов 31 минут назад
12 часов 2 минут назад
12 часов 10 минут назад
1 день 23 часов назад
2 дней 3 часов назад