Forth
http://fforum.winglion.ru/

ALSO в SPF
http://fforum.winglion.ru/viewtopic.php?f=18&t=629
Страница 1 из 1

Автор:  Pretorian [ Ср мар 21, 2007 10:42 ]
Заголовок сообщения:  ALSO в SPF

Не могу понять как так получается ALSO добавляет словарь в список для поиска :
Код:
VOCABULARU new
ALSO new


но по исходному коду
Код:
: ALSO GET-ORDER 1+ OVER SWAP SET-ORDER ;

оно должно последний в списке словарь дублировать.

Автор:  chess [ Ср мар 21, 2007 12:03 ]
Заголовок сообщения: 

Pretorian писал(а):
Не могу понять как так получается ALSO добавляет словарь в список для поиска :
VOCABULARU new
ALSO new

ALSO не добавляет новый словарь в список поиска, а как ты правильно понял дублирует первый словарь в списке поиска. То есть если просто выполнить ALSO, то слово два раза будет искаться в словаре, поставленным первым в список поиска.
В записи ALSO new сначала работает слово ALSO - оно первый в списке поиска словарь дублирует(ставит его первым в список поиска). Затем работает слово new (слово, созданное с помощью VOCABULARY).
Оно(new) заменяет первый словарь в списке поиска на словарь c именем new. Таким образом вновь созданный словарь new становится первым в списке поиска. Остальной порядок поиска не изменяется(для чего и использовали ALSO - если бы было без него( просто new) то из списка поиска изчез бы словарь, который был до этого первым в списке поиска).
В Форте (как правило) все слова работают отдельно, друг за другом. :o

Автор:  profiT [ Ср мар 21, 2007 14:43 ]
Заголовок сообщения: 

Хех.. Поздравляю, Pretorian. Это только человек который уже попривык к Форту может спросить такой вопрос. Так у него в голове будет непроизвольно возникать аналогия с Фортовым стеком и то что ALSO это "типа тоже самое" что и DUP.

А прикол в том что когда мы пишем "new", то он записывается не в новый элемент порядка поиска. А в верхний, перезаписывая его. Это отличается от обычного Фортовского:

Код:
1 2 3


.. и тогда у нас будет на стеке три числа. А если у нас будет три словаря (порождённые через VOCABULARY): ниф-ниф, наф-наф и нуф-нуф, то после:

Код:
ниф-ниф наф-наф нуф-нуф


... глубина порядка поиска никак не изменится. А на вершине останется "последний герой": нуф-нуф.

Глубину надо изменять вручную, как раз через ALSO. Тогда как со числами на стеке она увеличивается автоматически.

PS. Опоздал...

Автор:  in4 [ Ср мар 21, 2007 14:59 ]
Заголовок сообщения: 

Очень хочется спросить, а зачем сделали так? Получилось ведь не по-фортовски.
Я так и не смог себя заставить реализовать такое... :(

Автор:  profiT [ Ср мар 21, 2007 15:30 ]
Заголовок сообщения: 

Скорее всего (я правда тут буду щас пальцем в небо) из-за того что порядок поиска раньше включал в себя только один CURRENT, а потом когда сделали его списком то нарушать "старое" поведение (когда словарь при выполнении затирал CURRENT собой) не стали.

Автор:  WingLion [ Ср мар 21, 2007 16:37 ]
Заголовок сообщения: 

profiT писал(а):
Глубину надо изменять вручную, как раз через ALSO. Тогда как со числами на стеке она увеличивается автоматически.

ALSO глубину увеличивает на единичку, любой new - не изменяет.
Осталось разобраться, а какое же слово глубину уменьшает?
И что станет, если глубина окажется нулем?

Автор:  profiT [ Ср мар 21, 2007 16:50 ]
Заголовок сообщения: 

WingLion писал(а):
Осталось разобраться, а какое же слово глубину уменьшает?

PREVIOUS.

Автор:  chess [ Ср мар 21, 2007 16:51 ]
Заголовок сообщения: 

WingLion писал(а):
Осталось разобраться, а какое же слово глубину уменьшает?
И что станет, если глубина окажется нулем?

Глубина поиска уменьшается на 1 словом PREVIOUS, которое первый в списке поиска словарь удаляет из списка после чего первым в списке поиска становится бывший вторым словарь.
Если список поиска перед выполнением PREVIOUS пуст, то возникает неопределенная ситуация(а мало-ли таких ситуаций может в Форте возникать). :weep;
PS: не успел.

Автор:  chess [ Ср мар 21, 2007 17:17 ]
Заголовок сообщения: 

profiT писал(а):
А прикол в том что когда мы пишем "new", то он записывается не в новый элемент порядка поиска. А в верхний, перезаписывая его. Это отличается от обычного Фортовского:

В форте можно сделать так и для стека. Пример для константы которая "заменяет" верхний элемент на стеке.
Код:
CODE _NEW-CONSTANT-CODE
     POP EAX
     MOV  EAX, [EAX]
     RET
END-CODE

: NEW-CONST ( x "<spaces>name" -- )
  HEADER
  ['] _NEW-CONSTANT-CODE COMPILE, ,
;
5 NEW-CONST FIVE
И теперь
( 1 2 3 ) FIVE  ( 1 2 5 )

Автор:  WingLion [ Ср мар 21, 2007 17:19 ]
Заголовок сообщения: 

profiT писал(а):
PS. Опоздал...

chess писал(а):
PS: не успел.


:)) :)) :)) :))

Короче, совершенно непоследовательная система.
В одном месте запутано в угоду совместимости,
в другом запутано без оглядки на совместимость... :shock:

Автор:  in4 [ Чт мар 22, 2007 00:21 ]
Заголовок сообщения: 

Значит, надо сделать нормально и написать слой совместимости через этот кривой набор... ;)

Автор:  chess [ Чт мар 22, 2007 11:05 ]
Заголовок сообщения: 

in4 писал(а):
Значит, надо сделать нормально и написать слой совместимости через этот кривой набор...

Особой кривости не видно. Работать можно.

Автор:  yz [ Пт май 04, 2007 22:35 ]
Заголовок сообщения: 

WingLion писал(а):
Короче, совершенно непоследовательная система.
В одном месте запутано в угоду совместимости,
в другом запутано без оглядки на совместимость... :shock:

Да, стандарт F93 рождался в результате борьбы нескольких реализаций и представляет собой компромисс, который никого не удовлетворил.

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