Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 15:51

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 95 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7
Автор Сообщение
 Заголовок сообщения: Re: Глюк SPF?
СообщениеДобавлено: Ср июл 05, 2017 19:56 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
В СПФ можно выполнить слово из другого словаря обратившись к нему через :: .
И вот заметил в режиме интерпретации, операции со словарями через данное обращение работает некорректно.
Самый идиотский пример FORTH::GET-ORDER выведет не 1 а 2 словаря. Что уже ошибка.
Устраняется данная особенность одной строчкой, но из-за этого блокируется другая фича этого механизма.
А именно компиляция адреса из словаря ( vocab::['] test )
Механизм доступа к слову из словаря полезен, но, на мой взгляд, не очень корректен в СПФ.
Да и реализация тяжеловесная.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Глюк SPF?
СообщениеДобавлено: Сб июл 08, 2017 07:05 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Victor__v писал(а):
Самый идиотский пример FORTH::GET-ORDER выведет не 1 а 2 словаря. Что уже ошибка.
А как там это реализовано ? Если есть префикс vocab:: , то на время выполнения данного слова в цепочку поиска временно добавляется еще словарь vocab ? Тогда FORTH::GET-ORDER и должна выдавать на один словарь больше.
Да и при любой другой реализации этого дела будет неопределенная ситуация. Ибо раз префикс FORTH:: воздействует на order , то GET-ORDER не может выдать то-же, что и без этого префикса. Даже и по смыслу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Глюк SPF?
СообщениеДобавлено: Сб июл 08, 2017 13:39 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Код:
:
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

Но по логике должен завершаться ошибкой

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Глюк SPF?
СообщениеДобавлено: Вс июл 09, 2017 05:46 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Victor__v писал(а):
Так реализовать просто гораздо проще. Извините за каламбур.
Ну так и реализовал бы проще и выложил. Мол замените определение NOTFOUND на вот такую вот реализацию, перекомпилируйте и все будет корректно. Атвичаю.
Просто я SPF 4 пользуюсь для скоростного написания не сложных консольных прикладных программ на коленке, но вот в его внутренностях копаться (хотя в SPF 2 копался :lol: ) ... я тогда лучше свой Форт напишу, это интереснее. А если уж ты копаешься, то тебе и флаг в руки. Показывай лучшие варианты реализации кривых мест и все.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Глюк SPF?
СообщениеДобавлено: Вс июл 09, 2017 11:10 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Как раз свой форт пишу. Так уже нескольких кривых мест нету :)
А что с этим делать пока без понятия :)
Касательно этого пункта стадия - "компиляция в уме"

Цитата:
Ну так и реализовал бы проще и выложил

Ну, в СПФ реализовано проще некуда.
А в его внутренности я лезу за вдохновением.
И за тех.решениями.

Вот мой набросок:
Цитата:
: 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
;

Как можно заметить, код здесь немного повторяется.
СПФ-ский вариант за парой моментов гораздо проще

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 95 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB