При просмотре записей на форуме касательно моего форта несколько раз поднималась "предъява" к механизму notfound.
Явная вариация на тему "не читал, но осуждаю".
Распишу тут.
Реализация данного механизма в Nova-forth реализована совершенно иначе, чем в СПФ.
Мой вариант перебирает словари на стеке контекста и вызывая из них соответствующий код
до тех пор пока один их кодов не завершится успехом ИЛИ
не кончатся словари.
Реализация:
Код:
: NOTFOUND-GENERATE \ addr u -- ???
VOC0 @ CONTEXT 2>R \ R: -- down top \ переносим на стек возвратов указатели на дно и вершину стека контекста
2>R \ R: down top -- down top addr u
BEGIN
2 RPICK @ \ получаем LFA словаря из стека возвратов
L>notfoundFA @ \ достаем указатель на код обработчика
DUP IF 2R@ ROT EXECUTE THEN \ если обработчик есть (не равен 0) подсовываем ему строку и вызываем
\ если обработчик возвратил ИСТИНУ (не 0), то уходим
IF RDROP RDROP RDROP RDROP EXIT THEN
2R>
2R@ XOR WHILE \ если текущий указатель равен указателю дна стека контекста, уходим из цикла
R> CELL- >R \ смещаем текущий указатель стека словарей ближе к указателю дна стека
2>R
REPEAT
-2003 THROW
;
Короче, мой вариант в отличие от СПФ-кого работает за исчислимое время и не зависит от числа слов в словаре т. е. просто не страдает херней.