Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 17:04

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: FORTH-рефакторинг
СообщениеДобавлено: Пн ноя 02, 2015 11:43 
Еще одна задачка на рефакторинг.
Для реализации списка очевидно необходимы всего 4 слова: LD - адрес поля данных элемента, LN - адрес поля связи элемента, LA - выделение места под новый элемент, LF - освобождение места удаляемого элемента (мы не эстеты и слово ATOM - проверку, что в LD - "просто значение" или ссылка на вложенный список - не используем).
Требуется из этих четырех слов собрать (с минимизацией DUP-ов и SWAP-ов) слова для работы со следующими типами списков.
1. Просто список. Операции вставки и удаления.
2. Список структур. Каждый элемент списка верхнего уровня - ссылка на список определенной длины, каждый элемент которого "ассоциируется" с некоторым "полем структуры". Операции добавления/удаления новой "структуры", доступа к ее "полям".
3. Список параметров. Каждый элемент списка верхнего уровня - ссылка на список, первый элемент которого содержит идентификатор параметра, а остальные - его значение. Операции добавления/удаления параметра, доступ к его значению.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH-рефакторинг
СообщениеДобавлено: Сб ноя 28, 2015 11:26 
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+! дело не идет - только свапинг увеличивается. Проще в голове список представить и через них выразить, чем какие-то умные списковые слова измыслить.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH-рефакторинг
СообщениеДобавлено: Ср дек 02, 2015 13:55 
Продолжение писания в таком стиле привело к следующим наблюдениям:
1. Хотя, списки адекватно описывают любые ситуации на игровом поле, оперировать ими можно только вручную (программист/пользователь должен сам помнить помнить, "что где лежит"). Можно, конечно, ценой применения ООП и, соответственно, потери управляемости кода, "срезать несколько углов", перейдя от списковых данных к реляционным. Или, наоборот, усложнить программу анализаторами семантики символов.
2. Наиболее удобным будет двухуровневое представление данных: на уровне списков будет осуществляться ввод и запросы детальной информации, а на уровне статистики будет накапливаться информация, нужная для основных операций игры (суммарная сила, суммарный тоннаж, суммарный бонус и т.д.). Получается некий аналог ЭЛТ: списки представляют собой некоторый многомерный набор таблиц (реляционные "кубы данных"), изменения которой немедленно пересчитываются и отображаются в "главной таблице".
3. Концепция "главной таблицы" позволяет рассматривать ее как набор регистров, в которых удобно производить вычисления над списками, что избавит от необходимости протаскивать их через обычный стек данных.
4. Естественным FORTH-представлением этой структуры является вторичная FORTH-машина, отличающаяся от изначальной заменой СТЕКА на проблемно-ориентированную регистрово-табличную модель (возможно, имеющую естественное визуальное представление); и СЛОВАРЯ - на хранилище сигналов о необходимости пересчета (ЗНАЧЕНИЕ, соответственно, будет представляться состоянием списков).


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

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


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

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


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

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