Начальный курс программирования на языке Форт


ФЛАГ СОСТОЯНИЯ


Введем последний термин, имеющий отношение к процессу компиляции, - состояние. В большинстве Форт-систем есть переменная с именем STATE (СОСТОЯНИЕ), в которой содержится «истина», если вы работаете в режиме компиляции, и «ложь», если вы работаете в режиме интерпретации. Покажем способ вывода значения переменной STATE: : .СОСТОЯНИЕ STATE ? ; IMMEDIATE

Введите: .СОСТОЯНИЕ 0 ok

В момент вызова .СОСТОЯНИЕ Форт-система находилась в режиме интерпретации (то, что .СОСТОЯНИЕ является словом немедленного исполнения, не играет роли. Интерпретатор не проверяет бит немедленного исполнения).

Теперь вызовите слово .СОСТОЯНИЕ из нового определения: : ТЕСТ .СОСТОЯНИЕ ; -1 ok

На сей раз значение STATE равно «истине», поскольку .СОСТОЯНИЕ было инициировано компилятором.

В каких случаях возникает необходимость знать состояние? Всегда, когда вы хотите создать слово, которое должно «делать вид», что его поведение одинаково как внутри определения, так и вне его, а на самом деле оно проявляет себя по-разному. В качестве примера можно привести слово ASCII. При обычном использовании это слово появляется внутри определения через двоеточие: : ТЕСТ ( -- ascii-a) ASCII A ;

При исполнении слова ТЕСТ в вершину стека вносится число 65. ASCII осуществляет преобразование во время компиляции, Оно должно быть компилирующим словом: выбирать из входного потока символ, компилировать его как литерал, чтобы последний мог быть занесен в стек во время выполнения слова ТЕСТ. Вы можете создать компилирующий вариант слова ASCII следующим образом:: ASCII ( -- с ) \ Компиляция: с ( -- ) BL WORD 1+ С@ [COMPILE] LITERAL ; IMMEDIATE

(Примечание. Стековый комментарий в первой строке определяет поведение слова во время выполнения - это синтаксис использования слова. Комментарий во второй строке показывает, что должно произойти во время компиляции, в частности должно быть выполнено считывание символа из входного потока и ничего не оставлено в стеке.)

В приведенном выше определении слово WORD выбирает из входного потока текст, ограниченный пробелом, и вносит в вершину стека адрес участка памяти, где будет храниться строка со счетчиком.


Начало  Назад  Вперед



Книжный магазин