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


НЕСКОЛЬКО ДОПОЛНИТЕЛЬНЫХ СЛОВ УПРАВЛЕНИЯ КОМПИЛЯЦИИ - часть 3


Чтобы получить адрес третьей строки, вы могли бы воспользоваться выражением180 BLOCK 3 64 * +

но слишком много времени будет занимать всякий раз при использовании этого определения выполнение фразы: 3 64 *. В качестве альтернативы можно записать следующее:180 BLOCK 192 +

однако трудно сразу сообразить, что означает здесь 192. Лучшим решением является такое выражение:180 BLOCK [ 3 64 * ] LITERAL +

Арифметические операции выполняются только один раз, во время компиляции, а результат заносится в словарь как литерал.

Выше упоминалось о том, что слово ] повторно запускает процесс компиляции. На самом деле оно инициируется словом : и во многих системах является компилятором.

Приведем простой пример на применение литерала. Это определение может быть загружено с блока на диске.: НАПЕЧАТАЙ-ЭТО [ BLK @ ] LITERAL LIST ;

При исполнении слова ПЕЧАТЬ выводится тот блок, в котором оно определено. (Во время компиляции в BLK содержится номер последнего загруженного блока, LITERAL заносит этот номер в определение как литерал, так что во время выполнения последней будет служить аргументом для LIST.)

Здесь уместно дать определение LITERAL: : LITERAL ( n -- ) COMPILE (LITERAL) , ; IMMEDIATE

Сначала оно компилирует адрес кода периода выполнения, затем - само выражение (используя запятую).

Следующее слово для управления компиляцией - [COMPILE]. Допустим, вы хотите переименовать слово IF, но делать это так, как показано ниже: : если IF ; IMMEDIATE

не имеете права, поскольку слово IF само является немедленно исполняемым. Его код осуществляет переход, если условие не выполняется, на соответствующий оператор THEN. Вы должны каким-то образом обойти это препятствие (бит немедленного исполнения) и заставить IF компилироваться, как если бы оно было

обычным словом. В такой ситуации вам поможет слово [COMPILE] . Если определить : если [COMPILE] IF ; IMMEDIATE : иначе [COMPILE] ELSE ; IMMEDIATE : то [COMPILE] THEN ; IMMEDIATE

то у вас появится возможность по-новому записывать условия:: ветвление ( ?) если ." Истина " иначе ." Ложь " то ." флаг" ;




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



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