ЧТО ТАКОЕ ОПРЕДЕЛЯЮЩЕЕ СЛОВО?
Любое слово, которое создает новый заголовок в словаре, является определяющим. Некоторые из определяющих слов вы уже знаете, в частности : VARIABLE CONSTANT CREATE
Все они обладают одним общим свойством: «определять» слова и добавляют новые имена к словарю. В отличие от других языков Форт позволяет создавать свои собственные определяющие слова. Для чего это нужно? Вообще говоря, определяющие слова способствуют хорошему разбиению программы. Мы уже неоднократно излагали вам концепцию разбиения (см. гл. 8). Такая программа легко читается, легко воспринимается и легко исправляется.
Использование определяющих слов способствует хорошему разбиению, потому что дает возможность создавать целые классы, или семейства, слов с похожими свойствами. Признаки, объединяющие члены некоторого семейства, задаются не в определении каждого члена, а в определяющем слове.
Прежде чем предложить вам пример, рассмотрим, как специфицируются определяющие слова. Основой всех определяющих слов является простейшее из них - слово CREATE. Это слово выбирает из входного потока имя и создает для него в словаре заголовок.
Слово CREATE считается родителем, а слово ПРИМЕР - ребенком. Что делает ребенок в период выполнения? Он помещает свой собственный pfa в стек. А откуда он знает, что нужно делать именно это? Мы не задавали непосредственно ему никакой программы для выполнения. Ответ прост - ПРИМЕР вообще не содержит кода периода выполнения. Его указатель кода указывает на родителя (CREATE), у которого код периода выполнения есть.
Предположим, что в Форте нет слова VARIABLE. Мы можем его определить: : VARIABLE CREATE 0 , ;
Мы обратились к слову CREATE внутри определения через двоеточие. Что при этом произойдет? Давайте проследим за выполнением в хронологическом порядке:
: VARIABLE CREATE 0 , ;
1 Для пользователей систем фиг-Форта. Не забудьте переопределить слово CREATE следующим образом:
: CREATE <BUILDS DOES> ;
Определяется определяющее слово VARIABLE
VARIABLE АПЕЛЬСИНЫ
Исполняется слово VARIABLE, в свою очередь выполняя две функции:
CREATE. Создает с помощью CREATE заголовок в словаре с именем АПЕЛЬСИНЫ и указателем кода, который ссылается на код периода выполнения слова CREATE;
0, Засылает 16-разрядный нуль в поле параметров вновь созданной переменной и выделяет ячейку памяти.
АПЕЛЬСИНЫ
Исполняется слово АПЕЛЬСИНЫ. Так как указатель кода слова АПЕЛЬСИНЫ ссылается на код периода выполнения CREATE, pfa этого слова помещается в вершину стека. Конечно, мы могли бы обойтись без слова VARIABLE. Вполне достаточно ввести следующее: CREATE ПРИМЕР 0 ,
Однако такая запись менее изящна, поскольку здесь разбиты на отдельные действия создание заголовка и выделение памяти. Пример с определением слова VARIABLE демонстрирует лишь половину возможностей механизма определяющих слов. Если бы мы вместо VARIABLE воспользовались словом CREATE, то нам пришлось бы подкорректировать единственное место - в фазе 1, где происходит определение слова АПЕЛЬСИНЫ. И напротив, в фазе 3 слово АПЕЛЬСИНЫ вело бы себя одинаково при определении посредством как CREATE, так и VARIABLE.
Кроме того, Форт дает возможность создавать определяющие слова-родители, задающие поведение своих детей во время исполнения. Ниже в качестве примера приводится правильное определение слова CONSTANT (хотя на самом деле слова, подобные VARIABLE и CONSTANT, обычно определяются с помощью машинных кодов):: CONSTANT CREATE , DOES> @ ;
Здесь «собака зарыта» в выполнении слова DOES>, которое отмечает начало кода периода выполнения для всех своих детей. Как вы знаете, константы (т.е. дети определяющего слова CONSTANT) засылают в стек свои значения, которые хранятся в их поле параметров. Поэтому слово @, которое следует за DOES>, выбирает значение константы из ее собственного pfa.
В любом определяющем слове CREATE отмечает начало действий, выполняемых в период компиляции (фаза 2), a DOES> - конец действий периода компиляции и начало операций периода выполнения (фаза 3).
Проследим еще раз все наши действия:
: CONSTANT CREATE , DOES> @ ;
Определение определяющего слова CONSTANT.
76 CONSTANT ТРОМБОНЫ
Исполнение слова CONSTANT, которое в свою очередь выполняет следующие три действия:
Создает с помощью CREATE заголовок словарной статьи с именем ТРОМБОНЫ. Выбирает из стека значение (например, 76) и заносит его в поле параметров константы. Устанавливает указатель поля кода слова ТРОМБОНЫ на код, следующий за словом DOES.
ТРОМБОНЫ
Выполнение слова ТРОМБОНЫ. Поскольку указатель поля кода слова ТРОМБОНЫ теперь указывает код, следующий за DOES>, выбирается значение (76) и помещается в вершину стека. Обратите внимание на то, что в фазе 3 слово DOES> сначала помещает в вершину стека pfa ребенка. Иными словами, определение : VARIABLE CREATE 0 , ;
эквивалентно следующему: : VARIABLE CREATE 0 , DOES> ;
Последнее в период выполнения помещает в вершину стека pfa, а в период компиляции ничего не выполняет.
Так как определяющее слово задает поведение в двух различных фазах (периодах компиляции и выполнения), нужно соответствующим образом отразить это в стековой нотации. В частности, стековый комментарий определения слова CONSTANT имеет вид: : CONSTANT ( n -- ) CREATE , DOES> ( -- n) @ ;
Верхняя строка стекового комментария описывает поведение родителя во время компиляции, а нижняя, после DOES>, задает поведение ребенка.
DOES> | период-выполнения : ( - a) | Используется при создании определяющих слов. Отмечается конец участка периода компиляции и начала участка периода выполнения. Операции периода выполнения определены на высокоуровневом форте. Во время выполнения на стеке будет находиться pfa определенного слова. |