Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср апр 24, 2024 02:33

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Неужели баг SPF
СообщениеДобавлено: Чт янв 11, 2007 14:32 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Странное поведение кода. Суть кода -- создается битовый массив, который потом последовательно перебирается.
Код:
1024 CONSTANT Set.MaxByteSize
8192 CONSTANT Set.MaxEnt

: Set: ( Set: setA ) \ Создание нового пустого мн-ва
  CREATE
     Set.MaxByteSize ALLOCATE THROW DUP ,
     Set.MaxByteSize ERASE
  DOES> @
;

Set: T+3
Set: T+7

: ES2iaddr ( ent set -- i addr )
  SWAP 32 /MOD CELL * ROT + ;
: i2BitMask ( i -- bitmask )
  1 SWAP LSHIFT ;

: AddES ( ent set -- ) \ включить элемент ent во множество set
    ES2iaddr DUP @    ( i addr blk  )
    ROT i2BitMask     ( addr blk bitmask )
    OR  SWAP !
;

: ExistES? ( ent set -- 0|1 ) \ сущетсвует элемент ent в множестве set
    ES2iaddr @     ( i blk  )
    SWAP i2BitMask AND
;

: NextES ( i set -- j ) \ Возвращает ИД (j) следующего элемента множества set
SWAP BEGIN
   1+ ( set i )
   2DUP SWAP ExistES? IF NIP    LEAVE THEN
   DUP Set.MaxEnt = IF 2DROP -1 LEAVE THEN
AGAIN 
;

\ ------

  2 T+7 AddES   9 T+7 AddES 256 T+7 AddES 
 
  T+7 -1
  OVER NextES DUP .
  OVER NextES DUP .
  OVER NextES DUP .
  OVER NextES DUP .

Код поностью самодостаточный. Т.е результатом его выполнения должен быть вывод на консоль 4-х чисел. Но их нет!!!!

Пробую вручную в консоли выполнить вывод (одной строкой, важно!):
Код:
OVER NextES DUP .
расчет выполняется, но вывод не производится. Однако если разбиваю на два действия:
Код:
ОVER NextES
DUP .

Все работает как и требуется. Ниже, вывод консоли, иллюстрирующий сказанное
Код:
SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000/XP
Open source project at http://spf.sf.net
Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov
Version 4.18 Build 001 at 01.Dec.2006


Ok ( 3310796 4294967295(-1) ) / <-- результат работы кода. расчет правильный, но вывода нет
OVER NextES DUP . / <-- Иммитирую вручную, аналогичное поведение
Ok ( 3310796 2 )
OVER NextES    / <-- теперь в два захода
Ok ( 3310796 9 )
DUP .
9  Ok ( 3310796 9 ) / <-- что и ожидалось

В чем грабли?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 15:46 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Все, нашел. Некорректно делал выход из цикла BEGIN .... AGAIN -- нужно по EXIT Использовалось в определении слова NextES

Самое интересное, что spf4 нормально отрабатывал, а вот JPF375C.EXE выругался сразу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 15:55 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
AlexF писал(а):
Все, нашел. Некорректно делал выход из цикла BEGIN .... AGAIN -- нужно по EXIT Использовалось в определении слова NextES

Это правильно: по LEAVE выход из DO LOOP.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 16:16 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
К сожалению, EXIT -- выход вообще из слова... а как выйти только из цикла BEGIN .... AGAIN ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 16:27 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
AlexF писал(а):
К сожалению, EXIT -- выход вообще из слова... а как выйти только из цикла BEGIN .... AGAIN ?

А что вашу конструкцию BEGIN .... AGAIN нельзя определить как слово? По-моему можно. И выходить из этого
слова по EXIT внутри слова, в которое входит слово с BEGIN .... AGAIN.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 16:49 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
AlexF писал(а):
К сожалению, EXIT -- выход вообще из слова... а как выйти только из цикла BEGIN .... AGAIN ?


Можно воспользоваться моей библиотекой:

Код:
REQUIRE A_AHEAD ~mak\lib\a_if.f

: NextES ( i set -- j ) \ Возвращает ИД (j) следующего элемента множества set
SWAP BEGIN
   1+ ( set i )
   2DUP SWAP ExistES? IF NIP    A_AHEAD THEN
   DUP Set.MaxEnt = IF 2DROP -1 A_AHEAD THEN
AGAIN
A_THEN
A_THEN
;


или

Код:
REQUIRE A_AHEAD ~mak\lib\a_if.f

: NextES ( i set -- j ) \ Возвращает ИД (j) следующего элемента множества set
SWAP BEGIN
   1+ ( set i )
   2DUP SWAP ExistES? 0= A_IF
   DUP Set.MaxEnt <> A_IF
AGAIN
A_THEN  2DROP -1 EXIT
A_THEN  NIP
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 17:14 
AlexF писал(а):
К сожалению, EXIT -- выход вообще из слова... а как выйти только из цикла BEGIN .... AGAIN ?

Данная структурная конструкция не для выхода:)

Правильно будет используя BEGIN ... UNTIL , BEGIN ... WHILE ... UNTIL ,
комбинируя флаговые переменные.

или создать свою управляющую конструкцию, напрмер с множественными
выходами. Про данный подход хорошая статья была у ~mlg.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 17:22 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Anonymous писал(а):
Правильно будет используя BEGIN ... UNTIL , BEGIN ... WHILE ... UNTIL , комбинируя флаговые переменные.

Согласен. Но мне неудобно так думать. Увы :(
Anonymous писал(а):
Про данный подход хорошая статья была у ~mlg.
Если не сложно, ткните куда смотреть :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 17:26 
P.S Cм выше.
Ошибка закралась в BEGIN ... WHILE ... UNTIL
Модератора прошу подправить на BEGIN ... WHILE ... REPEAT


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 17:31 
Цитата:
или создать свою управляющую конструкцию, напрмер с множественными
выходами. Про данный подход хорошая статья была у ~mlg.

AlexF писал(а):
Если не сложно, ткните куда смотреть :)

http://www.forth.org.ru/~mlg/MoreBTng/ctlflow.htm


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 11, 2007 17:33 
AlexF писал(а):
Anonymous писал(а):
Про данный подход хорошая статья была у ~mlg.
Если не сложно, ткните куда смотреть :)

~mlg на forth.org.ru/~mlg
прямая ссылка на статью: http://www.forth.org.ru/~mlg/MoreBTng/ctlflow.htm

P.S. Комбинирование флаговых переменных например по AND достаточно удобно:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 05, 2007 14:16 
Попробовал скомпилировать плугин к фару из ~ygrek
и не получилось ( версия spf-418 )

Exception #-2003 at: E:\spf-418\devel\~ygrek/lib/far/struct.f:6818:
4 Union: Extra Selected History Mask ListItems ListPos VBuf ;
^ -2003 WORD OR FILE NOT FOUND

P.S. Возможно пост не в данный топик:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 05, 2007 14:40 
"Плагин для FAR" - ?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 05, 2007 22:43 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Ответил в вышеуказанный тред.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 07, 2007 14:55 
Не думаю, что баг в SPF.
Какую переменную в системе изменить, чтобы выполнялась функция
аккермана при заданных наперед больших числах?

: ACK
OVER 0=
IF NIP 1+
ELSE
DUP 0=
IF DROP 1- 1 RECURSE
ELSE
1- OVER SWAP RECURSE SWAP 1- SWAP RECURSE
THEN
THEN ;

3 7 ACK

P.S. Работа Форт системы завершается без каких либо указаний на ошибку:)
SPF-418


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

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


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

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


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

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