gudleifr писал(а):
Для реализации списка
Ну, что, ничего не надумалось?
У меня получается препохабненько (в примере - начало карточной военно-морской игры на Win32Forth):
Код:
: START ;
\ СТРОКОВЫЕ КОНСТАНТЫ
: SI ( <NAME> -- ) HERE CREATE >NAME , DOES> ( -- A) @ ;
: SD ( <NAME> -- A) HERE CREATE >NAME DUP , DOES> ( -- A) @ ;
\ МАССИВ ДЛЯ ХРАНЕНИЯ СПИСКОВ
HEX 10000 DECIMAL ALLOCATE DROP CONSTANT LST
: LD ( E -- AW) 2* CELLS LST + ;
: LN ( E -- AE) LD CELL+ ;
1 0 LD ! 0 0 LN !
: LA ( -- E) 0 LN @
IF 0 LN DUP @ DUP LN @ ROT !
ELSE 0 LD DUP @ DUP 1+ ROT ! THEN
0 OVER LN ! ;
: LF ( E --) 0 LN @ OVER LN ! 0 LN ! ;
\ ДОБАВЛЕНИЕ НОВОЙ ГОЛОВЫ СПИСКА ...
: L+ ( W,E1 -- E2) LA DUP>R LN ! R@ LD ! R> ;
\ ... И СОХРАНЕНИЕ ЕЕ ПО АДРЕСУ СТАРОЙ
: @L+! ( W,AE -- ) DUP>R @ L+ R> ! ;
\ ТАСОВАНИЕ СПИСКА ПУТЕМ УДАЛЕНИЯ ...
: L- ( E1,N -- E2,W) ?DUP
IF SWAP DUP ROT 1- 0 ?DO LN @ LOOP
LN DUP @ DUP LN @ ROT !
ELSE DUP LN @ SWAP THEN
DUP LD @ SWAP LF ;
\ ... И ВСТАВКИ В НОВЫЙ СПИСОК
: L// ( E1,N -- E2) 0 SWAP BEGIN
?DUP WHILE DUP>R RANDOM ROT SWAP L- ROT L+ R> 1- REPEAT
NIP ;
\ ПЕРЕБОР ЭЛЕМЕНТОВ СПИСКА ПО ПОРЯДКУ
: LR ( E,EX --) >R BEGIN ?DUP
WHILE DUP LD @ R@ EXECUTE ( E,W-- E)
LN @ REPEAT R>DROP ;
\ СУНДУКИ - НАБОР КОРАБЛЕЙ
\ СИМВОЛЫ
SI 3" SI 5" SI 16"
SI "A" SI "B" SI "C"
SI TORPEDO SI ASW SI AIR SI BOMBER
SI DAM-CTRL SI EVASIVE SI ECM SI COVER SI AIR-DEF
SI (I) SI (II) SI (III) SI (IV) SI (V) SI (VI)
SI USSSR SI USA SI GB SI ITALY SI FRANCE SI JAPAN
SI КРУПНЫЙ SI АВИАНОСЕЦ SI ПОДЛОДКА SI ЖИВУЧЕСТЬ SI ОЧКОВ
SI BB SI CVN
\ КАРТА - СПИСОК ТРИПЛЕТОВ (ИМЯ, СИМВОЛЫ, ПАРАМЕТРЫ), ГДЕ
\ СИМВОЛЫ - СПИСОК СИМВОЛОВ, А
\ ПАРАМЕТРЫ - СПИСОК ПАР (СИМВОЛ, ЗНАЧЕНИЕ)
: КАРТА+ ( E1 <NAME> -- E2) 0 0 0 L+ L+ SD SWAP L+ SWAP L+ ;
: S+ ( E,S -- E) OVER LD @ LN @ LD @L+! ;
: P= ( E,N,S -- E) SWAP 0 L+ L+ OVER LD @ LN @ LN @ LD @L+! ;
\ КАРТА С ТЕМИ ЖЕ ПАРАМЕТРАМИ, СПИСКИ, СРОСШИЕСЯ ХВОСТАМИ
: СИСТЕРШИП+ ( E1 <NAME> -- E2) DUP
LD @ LN @ DUP LD @ SWAP LN @ LD @ 0 L+ L+ SD SWAP L+ SWAP L+ ;
0 КАРТА+ IOWA BB S+ (I) S+ USA S+ КРУПНЫЙ S+ 5" S+ 16" S+ "B" S+ "C" S+ 10 ЖИВУЧЕСТЬ P= 14 ОЧКОВ P=
СИСТЕРШИП+ NEW-JERSEY
КАРТА+ CONSTELLATION CVN S+ (I) S+ USA S+ АВИАНОСЕЦ S+ КРУПНЫЙ S+ 12 ЖИВУЧЕСТЬ P= 22 ОЧКОВ P= 2 AIR P= 4 AIR-DEF P=
СИСТЕРШИП+ NIMITZ
СИСТЕРШИП+ KENNEDY
5 L//
CONSTANT КОРАБЛИ
\ ПРОВЕРКА
: EX5 8 SPACES DUP LD @ COUNT TYPE SPACE LN @ LD @ . CR ;
: EX4 ['] EX5 LR ;
: EX3 8 SPACES COUNT TYPE CR ;
: EX2 ['] EX3 LR ;
: EX1 DUP LD @ COUNT TYPE CR DUP LN @ LD @ EX2 LN @ LN @ LD @ EX4 CR ;
CR КОРАБЛИ ' EX1 LR
FORGET START
Пример работы:
NIMITZ
КРУПНЫЙ
АВИАНОСЕЦ
USA
(I)
CVN
AIR-DEF 4
AIR 2
ОЧКОВ 22
ЖИВУЧЕСТЬ 12
NEW-JERSEY
"C"
"B"
16"
5"
КРУПНЫЙ
USA
(I)
BB
ОЧКОВ 14
ЖИВУЧЕСТЬ 10
CONSTELLATION
КРУПНЫЙ
АВИАНОСЕЦ
USA
(I)
CVN
AIR-DEF 4
AIR 2
ОЧКОВ 22
ЖИВУЧЕСТЬ 12
KENNEDY
КРУПНЫЙ
АВИАНОСЕЦ
USA
(I)
CVN
AIR-DEF 4
AIR 2
ОЧКОВ 22
ЖИВУЧЕСТЬ 12
IOWA
"C"
"B"
16"
5"
КРУПНЫЙ
USA
(I)
BB
ОЧКОВ 14
ЖИВУЧЕСТЬ 10
ok
Т.е. дальше L+ и @L+! дело не идет - только свапинг увеличивается. Проще в голове список представить и через них выразить, чем какие-то умные списковые слова измыслить.