Фиксация результатов прямой цепочки рассуждений

На кошачьем форуме, видимо, дачный сезон
 
+
-
edit
 

Gudleifr

втянувшийся

I.
... кораблики в моей игре описываются в списковой базе данных, примерно так:

(BAKU CVHG USSR КРУПНЫЙ АВИАНОСЕЦ 3" "A" "C" (ЖИВУЧЕСТЬ 9) (ЦЕНА 15) (AIR 1) (AIR-DEF 2))

А рисуются пока примерно так:
code text
  1. USSR CVHG BAKU
  2.  
  3.     3"AC + \\
  4. \++++++000000000/

Как из первого получить второе, сохранив, прозрачность кода?
(Размышляя над этой темой, я понял, что опять вернулся к вопросу рисования экранных интерфейсов. Ведь, если "оконный" ввод на FORTH осуществляется элементарно - переназначением входного потока - жмешь кнопку, получаешь слово для исполнения, то с "оконным" выводом все гораздо страшнее - формы, вложенные объекты, куча эвентов-пропертей... А, ведь, возвращаясь к корабликам - это просто перенос управляющей информации из внутренних структур в процедуру рисования, из произвольной формы в строго упорядоченный шаблон. Этакий "FORTRAN-формат наоборот").
Итак, на входе ПЕРЕНОСЧИК пары "символ-значение" (Здесь и далее "символом" обозначаю описанное ранее слово, выдающее адрес своего имени), а на выходе рисование соответствующей фигульки в соответствующем месте.
Не будем поминать всуе функциональное программирование - сделаем проще. Прошьем в код пустой шаблон процедуры рисования. Например, рисование пушек будет выглядеть (в прошивке) так:
code text
  1. ...
  2. LIT 3" LIT 5" LIТ 16" РИСОВАТЬ-ПУШКИ
  3. ...

где символы служат якорями/сигнатурами, куда ПЕРЕНОСЧИК будет втюхивать значения (понятно, ПЕРЕНОСЧИК уродует не сам шаблон, а его дубликат, нам же не один кораблик рисовать).
После обработки символа 3" имеем:
code text
  1. ...
  2. LIT 1 LIT 5" LIТ 16" РИСОВАТЬ-ПУШКИ
  3. ...

Что и должно символизировать что, будучи запущенной, РИСОВАТЬ-ПУШКИ напечатает 3".

Для удобства поиска/обработки сигнатур имеет смысл применять в шаблоне вместо LIT специальное слово LIT0 (как LIT, но на стек всегда кладется ноль), которое будет заменяться на LIT при подстановке значения.

Конечно, возможны коллизии значение/символ и ноль/отсутствие, но в каждом частном случае они вполне победимы. Более того, способ представления символов делает возможным упрощенную прошивку:
code text
  1. ...
  2. РИСОВАТЬ-ПУШКИ 3" 5" 16"
  3. ...

где умный "шитый оборот" РИСОВАТЬ-ПУШКИ сам выберет из кода нужные ему значения и проигнорирует символы.

Заполненную процедуру можно не только пустить на рисование, но и сохранить в новом слове - рисования отдельного кораблика.

Конечно, можно не трогать процедуру рисования, а применить специальную таблицу (даже, таблицу структур), откуда она будет черпать значения, но при этом пропадет прозрачность кода. В БД все ясно, т.к. там тупо символы-значения, в процедуре рисования - тоже (что, где и когда рисуем). А таблица - это новый уровень косвенности, который программисту нужно рассчитывать особо.

II.
Пример:

: СИМВОЛ HERE CREATE >NAME , DOES> @ ;

СИМВОЛ КОРАБЛЬ СИМВОЛ КЛАСС
СИМВОЛ BAKU СИМВОЛ CVHG
СИМВОЛ USSR СИМВОЛ US СИМВОЛ UK СИМВОЛ FRANCE СИМВОЛ JAPAN
СИМВОЛ КРУПНЫЙ СИМВОЛ ЛИНКОР СИМВОЛ АВИАНОСЕЦ СИМВОЛ ПОДЛОДКА
СИМВОЛ 3" СИМВОЛ 5" СИМВОЛ 16"
СИМВОЛ "A" СИМВОЛ "B" СИМВОЛ "C"
СИМВОЛ AIR СИМВОЛ AIR-DEF СИМВОЛ AIR-ASW
СИМВОЛ ЦЕНА СИМВОЛ ЖИВУЧЕСТЬ

: LIT0 R> CELL+ >R 0 ;

: НАЦИЯ. 5 0 DO DUP IF COUNT TYPE SPACE ELSE DROP THEN LOOP ;
: ИМЯ. DUP IF COUNT TYPE SPACE ELSE DROP THEN ;
: ПУШКИ. IF ." 3#" THEN IF ." 5#" THEN IF ." 16#" THEN ;
: РАКЕТЫ. IF ." A" THEN IF ." B" THEN IF ." C" THEN ;
: САМОЛЕТЫ. DUP IF 0 DO ." +" LOOP SPACE ELSE DROP THEN ;
: ПВО. DUP IF 0 DO ." \" LOOP SPACE ELSE DROP THEN ;
: ПЛО. DUP IF 0 DO ." /" LOOP SPACE ELSE DROP THEN ;
: КОРПУС. OVER - 0 DO ." +" LOOP 0 DO ." 0" LOOP ;

CREATE РИСОВАЛКА 0 , ]
LIT0 US LIT0 USSR LIT0 UK LIT0 FRANCE LIT0 JAPAN НАЦИЯ.
LIT0 КЛАСС ИМЯ. LIT0 КОРАБЛЬ ИМЯ. CR CR
3 SPACES
LIT0 16" LIT0 5" LIT0 3" ПУШКИ.
LIT0 "C" LIT0 "B" LIT0 "A" РАКЕТЫ.
SPACE LIT0 AIR САМОЛЕТЫ. LIT0 AIR-DEF ПВО. LIT0 AIR-ASW ПЛО.
CR ." \"
LIT0 ЖИВУЧЕСТЬ LIT0 ЦЕНА КОРПУС.
." /" CR ;
HERE РИСОВАЛКА !

: ПЕРЕНОСЧИК ( СИМВОЛ, ЗНАЧЕНИЕ --)
РИСОВАЛКА DUP @ SWAP CELL+ DO
I @ ['] LIT0 = IF
OVER I CELL+ @ EXECUTE = IF
['] LIT I ! DUP I CELL+ ! THEN
2 CELLS ELSE CELL THEN +LOOP 2DROP ;

\ В БОЕВЫХ УСЛОВИЯХ ПЕРЕНОСЧИК БУДЕТ ВЫЗЫВАТЬСЯ В ЦИКЛЕ ПЕРЕБОРА СПИСКА
КЛАСС CVHG ПЕРЕНОСЧИК
USSR USSR ПЕРЕНОСЧИК
КОРАБЛЬ BAKU ПЕРЕНОСЧИК
3" 1 ПЕРЕНОСЧИК
"A" 1 ПЕРЕНОСЧИК
"C" 1 ПЕРЕНОСЧИК
AIR 1 ПЕРЕНОСЧИК
AIR-DEF 2 ПЕРЕНОСЧИК
ЖИВУЧЕСТЬ 9 ПЕРЕНОСЧИК
ЦЕНА 15 ПЕРЕНОСЧИК

: EX1 РИСОВАЛКА CELL+ >R ;
CR CR EX1 CR

III.
Видно, что предложенная схема перевода "итератора в структуру" обладает, по крайней мере тремя недостатками:
1. Добавление в структуру каждого нового факта требует полного просмотра структуры на предмет соответствующих якорей. Этот недостаток неустраним, т.к. постулируются независимость итератора от структуры и отсутствие дополнительных таблиц их соответствия.
2. Невзирая на то, что все логические переменные вычисляются ПЕРЕНОСЧИКОМ, сами логические выражения вычисляются при исполнении структуры.
3. Т.к. шитый код структуры не является перемещаемым (содержит абсолютные адреса переходов), то в случае использования нескольких итераторов с одной структурой следует сложный оверлейный балет.
Недостатки (2) и (3) можно победить одним и тем же способом: хранением в структуре не готового шитого кода, но кода (или текста), генерирующего целевой шитый код.
 47.047.0

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru