Странное поведение кода. Суть кода -- создается битовый массив, который потом последовательно перебирается.
Код:
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 ) / <-- что и ожидалось
В чем грабли?