Язык Форт и его реализации

         

Определяющие слова - часть 2


Его определение можно задать так:

: CONSTANT ( N ---> ) CREATE , DOES> @ ;

Часть определения от слова CREATE до DOES> называется создающей (CREATE — создать), остальная часть от слова DOES> и до конца называется исполняющей (DOES — исполняет). В данном случае создающая часть состоит из одного слова , (запятая), а исполняющая часть — из слова @ (разыменование).

Рассмотрим исполнение данного определения на примере 4 CONSTANT XOP. Слово 4 кладет число 4 на стек. Далее исполняется слово CONSTANT. Слово CREATE, с которого начинается его определение, выбирает из входной строки очередное слово (в данном случае XOP) и добавляет его в словарь как новую команду. Создающая часть, состоящая из слова «запятая», переносит число 4 в память, компилируя его на вершину словаря. Слово DOES>, отмечающее конец создающей части, завершает исполнение данного определения, при этом семантикой созданного слова XOP будет последовательность действий исполняющей части, начиная от слова DOES>. В дальнейшем исполнение слова XOP начнется с того, что слово DOES> положит на стек адрес вершины словаря, какой она была на момент начала работы создающей части, после чего будет работать исполняющая часть определения. Поскольку по данному адресу создающая часть скомпилировала число 4, то исполняющая часть — разыменование — заменит на стеке этот адрес его содержимым, т.е. числом 4, что и требуется по смыслу данного понятия.

Рассмотрим другой пример. Введем понятие вектора. При создании вектора будем указывать размер (число элементов), а при обращении к нему — индекс (номер) элемента, в результате чего получается адрес данного элемента. Этот адрес можно разыменовать и получить значение элемента или можно заслать по этому адресу новое значение. Если желательно контролировать правильность индекса при обращении к вектору, то определение может выглядеть так:

: ВЕКТОР ( N:PA3MEP ---> ) CREATE DUP , 2* ALLOT DOES> ( I:ИНДЕКС,A ---> A[I]:АДРЕС ЭЛ-ТА I) OVER 1- OVER @ U< ( ПРОВЕРКА ИНДЕКСА) IF SWAP 2* + EXIT THEN ." ОШИБКА В ИНДЕКСЕ" ABORT ;




Содержание  Назад  Вперед