Forth http://www.fforum.winglion.ru/ |
|
Notfound в Nova http://www.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/ |