Forth
http://www.fforum.winglion.ru/

контейнеры с данными внутри кода
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=1929
Страница 1 из 2

Автор:  mOleg [ Пт фев 06, 2009 16:30 ]
Заголовок сообщения:  контейнеры с данными внутри кода

собственно просто полезный набросок того, как в пространстве слова можно хранить данные.
слова внутри скобок интерпретируются, а не компилируются !!!
пространство надо резервировать либо с помощью ALLOT, либо с помощью компилирующих слов.

source file: box.fts
\ 2009-02-05 ~mOleg
\ Copyright [C] 2009-2013 mOleg mOlegg@ya.ru
\ контейнеры с данными внутри кода

ALSO HIDDEN ALSO FORTH DEFINITIONS

\ обойти данные в коде, начинающиеся со следующей ячейки,
\ вернуть адрес начала данных
\ : (BOX) ( r: addr --> addr ) AR@ CELL + AR@ @ R+ ;

\ для использования в других структурах не-immediate варианты BOX[ ]BOX
: BOX{ ( --> l: addr ) ?COMP COMPILE (BOX) HERE >L 0 , ;
: }BOX ( l: addr --> ) HERE L@ - L> ! ;

\ начать описание контейнера
: BOX[ ( --> l: addr ) BOX{ [COMPILE] [ ; IMMEDIATE

\ завершить описание контейнера, зафиксировать его размер,
\ вернуться к состоянию компиляции
: ]BOX ( l: addr --> ) }BOX ] ; IMMEDIATE

PREVIOUS RECENT

?ABSENT test{ \EOF -- тестовая секция ------------------------------------------

test{ : test 479875 BOX[ 49857 , -1984 , 564757 , ]BOX 98374 ;
test 98374 <> THROW SWAP 479875 <> THROW
DUP @ 49857 <> THROW
DUP CELL + @ -1984 <> THROW
2 CELLS + @ 564757 <> THROW
}test

\EOF пример использования:

: test ." контейнер данных в коде начинается с "
BOX{ 10 ALLOT }BOX H.
." Адреса " ;

\EOF
так в пространстве слова можно хранить данные.
слова внутри скобок интерпретируются, а не компилируются !!!
пространство надо резервировать либо с помощью ALLOT, либо с помощью
компилирующих слов.

Автор:  Hishnik [ Пт фев 06, 2009 16:39 ]
Заголовок сообщения: 

Код:
: CONTAINER CREATE [C]HERE , DOES> @ ;

CONTAINER КУЧАДАННЫХВКОДЕ 10 [C]ALLOT

Автор:  mOleg [ Пт фев 06, 2009 16:53 ]
Заголовок сообщения: 

Хищник писал(а):
: CONTAINER CREATE [C]HERE , DOES> @ ;
CONTAINER КУЧАДАННЫХВКОДЕ 10 [C]ALLOT

: samlpe   BOX{ 10 ALLOT }BOX ." адрес первого ящика: " . CR
BOX{ 20 ALLOT }BOX ." адрес второго ящика: " . CR
;

Автор:  mOleg [ Пт фев 06, 2009 17:24 ]
Заголовок сообщения: 

собственно, ведь я не утверждаю, что нельзя использовать другие методы, можно ведь делать так:

: sample s" space for data" ( --> addr # ) ;

то есть обычные литеральные строки использовать для хранения данных, можно еще кучу вариантов придумать.

Речь идео об иллюстрации использования стека возвратов для управления логикой работы программы, и возможности использования пространства кода в целях хранения данных (без создания дополнительных, в том числе порождающих, слов).

Автор:  Hishnik [ Пт фев 06, 2009 17:25 ]
Заголовок сообщения: 

Ну это после того как BOX{ }BOX описаны. А зачем их описывать, если выделить память в пространстве кода можно и так?

Автор:  mOleg [ Пт фев 06, 2009 17:29 ]
Заголовок сообщения: 

Хищник, читай внимательно первый пост в теме :)

Автор:  Hishnik [ Пт фев 06, 2009 17:40 ]
Заголовок сообщения: 

Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?

Автор:  mOleg [ Пт фев 06, 2009 17:45 ]
Заголовок сообщения: 

Хищник писал(а):
Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?

значит невнимательно прочитал.
есть такое выражение "в образовательных целях", то есть показано как можно делать контейнеры данных в коде :) Причем пример не совсем бесполезный, так как внутри BOX{ }BOX можно не только резервировать пространство, но и инициализировать данные, что в случае других рассмотренных вариантов не работает.

Автор:  Hishnik [ Пт фев 06, 2009 17:55 ]
Заголовок сообщения: 

Код:
CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],

Автор:  mOleg [ Пт фев 06, 2009 18:03 ]
Заголовок сообщения: 

Хищник писал(а):
Код:CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],

минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )

Автор:  Hishnik [ Пт фев 06, 2009 18:29 ]
Заголовок сообщения: 

mOleg писал(а):
минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )

Код:
1 [C], 2 [C], 3 [C],

Автор:  WingLion [ Пт фев 06, 2009 18:56 ]
Заголовок сообщения: 

Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?

п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"

Автор:  mOleg [ Пт фев 06, 2009 19:01 ]
Заголовок сообщения: 

WingLion писал(а):
п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"

тот, кому надо на "учебные цели" не будет смотреть.

WingLion писал(а):
Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?

может, но оно не всегда надо. Не всегда хочется создавать себе проблемы.
Объявляя глобальное имя, всегда думаешь, что найдется умелец, который решит использовать удобное место для хранения своих данных.
То есть иногда нужно иметь приватные данные внутри слова, которые никто не сможет использовать без особого изврата.
А написать в коде BOX{ ... }BOX проще, чем писать: CREATE нужные-мне-данные 100 ALLOT

Автор:  _Harry [ Пт мар 27, 2009 13:17 ]
Заголовок сообщения: 

Если говорить об образовательных целях,
то надо бы так:
Код:
\ 2009-02-05 ~mOleg

\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com

\ контейнеры с данными внутри кода (набросок)



\ выложить адрес содержимого контейнера

\ и обойти данные в коде

\ : (BOX) ( r: addr --> ) R@ CELL + R> @ JUMP ;
: (BOX) ( r: addr --> addr ) \ стековая диаграмма вроде должна быть такая???
R@ CELL + \ Положить на стек адрес начала контейнера данных
R> @ JUMP ;  \  Перейти на адрес следующий за контейнером

\ начать описание контейнера

: BOX{ ( --> )

       COMPILE (BOX) HERE 0 A,  \ по идее надо написать зачем пишем 0

       [COMPILE] [ ; IMMEDIATE



: }BOX ( addr --> ) HERE SWAP A! ] ; IMMEDIATE  \ ну и здесь тоже что за адрес зачем пишется?



\EOF пример использования:



: test ." контейнер данных в коде начинается с "

       BOX{ 10 ALLOT }BOX H.

       ." Адреса " ;

Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче :)
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.

Автор:  mOleg [ Пт мар 27, 2009 13:25 ]
Заголовок сообщения: 

_Harry писал(а):
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.

а вот, пожалуйста смотрите в пример ;)

_Harry писал(а):
Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче

а это поправимо :)

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/