КОНТЕКСТНЫЕ СЛОВАРИ (СПИСКИ СЛОВ)
В простой Форт-системе имеются три штатных контекстных словаря: словарь Форта, словарь редактора и словарь ассемблера.
Все рассмотренные выше слова принадлежат словарю Форта, за исключением команд редактора, которые относятся к словарю редактора. В словарь ассемблера включены команды, предназначенные для программирования на языке Ассемблера конкретного компьютера.
Определения добавляются в один и гот же словарь в порядке их компиляции, независимо от того, к какому контекстному словарю они принадлежат. Таким образом, контекстные словари являются не подразделами словаря как участка памяти, а связанными списками, переплетенными между собой внутри этого общего словаря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) | Занесение в стек адреса начала буфера входного текста. |