Forth http://fforum.winglion.ru/ |
|
Глюк SPF? http://fforum.winglion.ru/viewtopic.php?f=18&t=1533 |
Страница 7 из 7 |
Автор: | Victor__v [ Ср июл 05, 2017 19:56 ] |
Заголовок сообщения: | Re: Глюк SPF? |
В СПФ можно выполнить слово из другого словаря обратившись к нему через :: . И вот заметил в режиме интерпретации, операции со словарями через данное обращение работает некорректно. Самый идиотский пример FORTH::GET-ORDER выведет не 1 а 2 словаря. Что уже ошибка. Устраняется данная особенность одной строчкой, но из-за этого блокируется другая фича этого механизма. А именно компиляция адреса из словаря ( vocab::['] test ) Механизм доступа к слову из словаря полезен, но, на мой взгляд, не очень корректен в СПФ. Да и реализация тяжеловесная. |
Автор: | Ethereal [ Сб июл 08, 2017 07:05 ] |
Заголовок сообщения: | Re: Глюк SPF? |
Victor__v писал(а): Самый идиотский пример FORTH::GET-ORDER выведет не 1 а 2 словаря. Что уже ошибка. А как там это реализовано ? Если есть префикс vocab:: , то на время выполнения данного слова в цепочку поиска временно добавляется еще словарь vocab ? Тогда FORTH::GET-ORDER и должна выдавать на один словарь больше.Да и при любой другой реализации этого дела будет неопределенная ситуация. Ибо раз префикс FORTH:: воздействует на order , то GET-ORDER не может выдать то-же, что и без этого префикса. Даже и по смыслу. |
Автор: | Victor__v [ Сб июл 08, 2017 13:39 ] |
Заголовок сообщения: | Re: Глюк SPF? |
Код: : NOTFOUND ( a u -- ) \ обращение к словам в словарях в виде vocname1::wordname \ или vocname1::vocname2::wordname и т.п. \ или vocname1:: wordname \ Слово wordname транслируется в модифицированном контексте (!) 2DUP 2>R ['] ?SLITERAL CATCH ?DUP IF NIP NIP 2R> 2DUP S" ::" SEARCH 0= IF 2DROP 2DROP THROW THEN \ Вообще есть :: ? 2DROP ROT DROP GET-ORDER N>R BEGIN ( a u ) 2DUP S" ::" SEARCH WHILE ( a1 u1 a3 u3 ) 2 -2 D+ ( пропуск разделителя :: ) 2>R R@ - 2 - SFIND IF SP@ >R ALSO EXECUTE SP@ R> - 0= IF CONTEXT ! THEN ELSE ( a1 u' ) RDROP RDROP NR> SET-ORDER -2011 THROW THEN 2R> REPEAT NIP 0= IF 2DROP PARSE-NAME THEN ['] EVAL-WORD CATCH NR> SET-ORDER THROW ELSE RDROP RDROP THEN ; Вот и вся реализация. Цитата: Ибо раз префикс FORTH:: воздействует на order Так реализовать просто гораздо проще. Извините за каламбур. Можно сделать так, чтобы после поиска в контексте сразу искать в найденном словаре, а не перерыскивать весь контекст заново. Это лишает некоторых фич как FORTH::['] FORTH , но сразу даёт понять что в словаре нет искомого слова В СПФ данный пример работает Цитата: VOCABULARY TEST 10 FORTH::TEST::DUP \ a -- a a Но по логике должен завершаться ошибкой |
Автор: | Ethereal [ Вс июл 09, 2017 05:46 ] |
Заголовок сообщения: | Re: Глюк SPF? |
Victor__v писал(а): Так реализовать просто гораздо проще. Извините за каламбур. Ну так и реализовал бы проще и выложил. Мол замените определение NOTFOUND на вот такую вот реализацию, перекомпилируйте и все будет корректно. Атвичаю.Просто я SPF 4 пользуюсь для скоростного написания не сложных консольных прикладных программ на коленке, но вот в его внутренностях копаться (хотя в SPF 2 копался ) ... я тогда лучше свой Форт напишу, это интереснее. А если уж ты копаешься, то тебе и флаг в руки. Показывай лучшие варианты реализации кривых мест и все. |
Автор: | Victor__v [ Вс июл 09, 2017 11:10 ] |
Заголовок сообщения: | Re: Глюк SPF? |
Как раз свой форт пишу. Так уже нескольких кривых мест нету А что с этим делать пока без понятия Касательно этого пункта стадия - "компиляция в уме" Цитата: Ну так и реализовал бы проще и выложил Ну, в СПФ реализовано проще некуда. А в его внутренности я лезу за вдохновением. И за тех.решениями. Вот мой набросок: Цитата: : VOC-ACCESS? \ addr u -- ?? -1| 0 S" ::" SPLIT ( A U s-A s-U -- A U 0 | A1 U1 A2 U2 -1 ) 0= IF 2DROP 0 EXIT THEN 2SWAP SFIND ( addr u -- addr u 0| ffa@ xt -1 ) 0= IF 2DROP 2DROP 0 EXIT THEN NIP DUP ['] VOC-CODE CALL-in-addr? ( addr xt -- -1|0 ) 0= IF DROP 2DROP 0 EXIT THEN \ это словарь? >param @ >R BEGIN \ теперь ищем не в контексте, а цепочечно R@ SFIND-IN-VOC ( addr u lfa -- addr u 0| ffa@ xt -1 ) IF RDROP STATE @ IF FFA-COMPILE, ELSE NIP EXECUTE THEN -1 EXIT ELSE S" ::" SPLIT 0= IF 2DROP RDROP 0 EXIT THEN 2SWAP R@ SFIND-IN-VOC 0= IF 2DROP 2DROP RDROP 0 EXIT THEN NIP DUP ['] VOC-CODE CALL-in-addr? ( addr xt -- -1|0 ) 0= IF DROP 2DROP RDROP 0 EXIT THEN >param @ RP@ ! AGAIN ; Как можно заметить, код здесь немного повторяется. СПФ-ский вариант за парой моментов гораздо проще |
Страница 7 из 7 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |