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

КОНТЕКСТНЫЕ СЛОВАРИ (СПИСКИ СЛОВ)


В простой Форт-системе имеются три штатных контекстных словаря: словарь Форта, словарь редактора и словарь ассемблера.

Все рассмотренные выше слова принадлежат словарю Форта, за исключением команд редактора, которые относятся к словарю редактора. В словарь ассемблера включены команды, предназначенные для программирования на языке Ассемблера конкретного компьютера.

Определения добавляются в один и гот же словарь в порядке их компиляции, независимо от того, к какому контекстному словарю они принадлежат. Таким образом, контекстные словари являются не подразделами словаря как участка памяти, а связанными списками, переплетенными между собой внутри этого общего словаря1.

В качестве примера рассмотрим три контекстных словаря: «футбол», «бейсбол» и «баскетбол» (см. рисунок). Все они совместно существуют в одном и том же общем словаре, однако апостроф, проходя по цепи, имеющей отношение, скажем, к баскетболу, пере-

1 Необходимо отличать общий словарь (dictionary) как прерывный участок памяти для размещения слов от словаря (vocabulary) - связанного списка слов. Примерами последнего могут служить словари Форта, редактора и ассемблера. - Примеч. ред.

бирает только слова из баскетбольного словаря. Даже если в каждом контекстном словаре есть слово ЦЕНТР, апостроф подберет его вариант, требуемый для данного контекста.

Помимо замкнутости контекстных словарей, необходимо отметить еще одно преимущество такой организации данных - скорость поиска. Если в нашем примере идет речь о баскетболе, то зачем нам перебирать слова, относящиеся к футболу и бейсболу?

Вы можете переключить контекст поиска по словарю, выполнив любую из трех команд: FORTH, EDITOR или ASSEMBLER. Например, вводя слово FORTH, вы уверены, что поиск будет осуществляться в контексте словаря Форта. Но, как правило, Форт-система изменяет для вас контекст автоматически. Рассмотрим типичную схему. Система начинает работу с контекста словаря Форта. Допустим, вы заносите некоторую программу в блок.
Конкретные команды редактора переключают контекст на словарь редактора. Вы работаете в контексте словаря редактора до тех пор, пока не осуществите загрузку вашего блока и не приступите к компиляции определений. Слово : автоматически восстанавливает контекст, который был ранее, а именно: Форт.

Различные версии Форт-систем имеют различные реализации контекстных словарей. Однако существуют некоторые общие положения, которые можно распространить на большинство систем.

Словарь, где должен осуществляться поиск, определяется пользовательской переменной с именем CONTEXT (КОНТЕКСТ). Как



уже упоминалось выше, команды FORTH, EDITOR и ASSEMBLER изменяют контекст поиска.

Известен еще один вид контекста: словарь, к которому должно быть присоединено новое определение. Такой словарь задается другой переменной с именем CURRENT (ТЕКУЩИЙ). Поскольку CURRENT обычно определяет словарь Форта, то новые определения, как правило, присоединяются к данному словарю.

А каким образом система компилирует слова в словари редактора и ассемблера? Это делается с помощью слова DEFINITIONS (ОПРЕДЕЛЕНИЯ), например: EDITOR DEFINITIONS

Вы знаете, что слово EDITOR устанавливает CONTEXT для редактора. Слово DEFINITIONS копирует содержимое слова CONTEXT, каким бы оно ни было, в слово CURRENT. Слово DEFINITIONS имеет простое определение:: DEFINITIONS CONTEXT @ CURRENT ! ;

После вывода выражения EDITOR DEFINITIONS все компилируемые с этого момента слова заносятся в словарь редактора до тех пор, пока вы не введете выражение FORTH DEFINITIONS, чтобы поместить в CURRENT Форт.

Техника работы с контекстными словарями существенно зависит от конкретной системы и в какой-то степени противоречива. В Стандарте-83 подробности опущены, а потому обойдемся без них и мы. Обращайтесь к документации по своей системе.



' ххх 

( -- а)



Осуществляется поиск в словаре адреса слова ххх ( следующего слова из входного потока ) .



['] 

период-компиляции: ( -- ) период-выполнения: ( -- a)



Используется только в определении через двоеточие. Компиляция адреса следующего слова из определения как литерала.



EXECUTE 



( a -- )



Выполнение элемента словаря, адрес поля параметров которого находится на стеке.



@EXECUTE 

( a -- )



Выполнение элемента словаря, на pfa которого ссылается содержимое по адресу а. Если адрес содержит нуль, то @EXECUTE ничего не выполняет.



>BODY 

( cfa -- pfa)



Вычисление адреса поля параметров определения, адрес компиляции которого находится на стеке.



EXIT



( -- )



Удаление адреса возврата, из вершины стена возвратов и занесение его в указатель адресного интерпретатора. Если слово EXIT скомпилировано в определении через двоеточие, то оно завершает выполнение этого определения в данной точке.



QUIT



( -- )



Очистки стека возвратов и передача управлений терминалу, ожидающему ввода. Сообщения при этом ни выдается.



ABORT



( -- )



Очистке стека данных и выполнение функций слова QUIT. Сообщения не выдаются.



H или DP



( -- a)



Занесение в стек адреса указателя словаря.



HERE



( -- a)



Занесение в стек адреса очередного доступного участка словаря.



PAD



( -- a)



Занесение в стен адреса начала рабочей области, в которой хранятся строки символов в процессе промежуточной обработки.



SP@ или 'S



( -- a)



Занесение в стек адреса вершины стека данных до того, как исполнено сама слово SP@.



S0



( -- a)



Содержится адрес дна стека данных.



TIB



( -- a)



Занесение в стек адреса начала буфера входного текста.


Содержание раздела