Forth
http://fforum.winglion.ru/

Notfound в Nova
http://fforum.winglion.ru/viewtopic.php?f=58&t=3273
Страница 1 из 1

Автор:  Victor__v [ Пт июл 10, 2020 17:02 ]
Заголовок сообщения:  Notfound в Nova

При просмотре записей на форуме касательно моего форта несколько раз поднималась "предъява" к механизму 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
;


Короче, мой вариант в отличие от СПФ-кого работает за исчислимое время и не зависит от числа слов в словаре т. е. просто не страдает херней.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/