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



         

Управление поиском слов - часть 4


В случае неудачи слово FIND возвращает прежний адрес строки со счетчиком и значение 0 — сигнал о неудаче.

Разумеется, слова ' и ['] используют слово FIND :

: ' ( ---> A ) BL WORD FIND IF EXIT THEN COUNT TYPE -1 ABORT" ?" ; : ['] ( ---> ) ' COMPILE LIT , ; IMMEDIATE : [COMPILE] ( ---> ) ' , ; IMMEDIATE

которое, таким образом, является основным в определении порядка поиска слов.

В заключение рассмотрим определение стандартного слова FORGET, которое вводит очередное слово, ищет его в словаре и исключает из словаря вместе со всеми словами, определенными после него.

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

: FORGET ( ---> ) >NAME ( NFA) DUP FENCE @ U< ABORT" ЗАЩИТА ПО FENCE" >R VOC-LINK ! ( NO:ВХОД В СПИСОК СПИСКОВ) BEGIN R@ OVER U< WHILE ( N:ЗВЕНО СВЯЗИ СПИСКА) FORTH DEFINITIONS @ DUP VOC-LINK ! ( N1:ЗВЕНО СЛЕДУЩЕГО) REPEAT ( N1:ЗВЕНО ОСТАВШЕГОСЯ СПИСКА) BEGIN DUP 4 - ( N:ЗВЕНО СВЯЗИ,L:ВХОД В СЛОВА) BEGIN N>LINK @ ( N,NFA:ОЧЕРЕДНОЕ СЛОВО) DUP R@ U< UNTIL ( N,NFA:ОСТАЮЩЕЕСЯ СЛОВО) OVER 2- ( N,NFA1,L:АДРЕС СВЯЗИ ФИКТИВНОЙ СТАТЬИ) ! @ ?DUP 0= UNTIL R> ( NFA0 ) HERE - ALLOT ;

Сначала определяется адрес статьи исключаемого слова, проверяется, что она расположена выше границы защиты, и этот адрес сохраняется на стеке возвратов. В ходе исполнения первого цикла перебираются все существующие статьи для списков слов и исключаются те, адреса которых оказались больше данного (в силу монотонного убывания адресов в цепном списке VOC-LINK цикл прекращается, как только адрес очередной статьи оказывается меньше данного). Во время исполнения второго цикла продолжается перебор оставшихся статей для списков слов, при этом в каждом списке отсекаются статьи, адреса которых больше данного (здесь опять используется монотонное убывание адресов словарных статей в пределах одного списка).В заключение указатель вершины словаря понижается до заданного адреса, тем самым освобождая память в словаре. Перед началом описанных действий переменные CONTEXT и CURRENT устанавливаются на список FORTH, чтобы их значение было осмыслено во все время дальнейшей работы.




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