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

работа со структурами, все думаю как лучше
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2115
Страница 1 из 2

Автор:  mOleg [ Чт май 21, 2009 19:08 ]
Заголовок сообщения:  работа со структурами, все думаю как лучше

вот еще один вариант работы со структурами:

<pre>
\ 20.05.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ структуры со сложным поведением полей

math/ useful.fts
string/ stradd.fts

ALSO HIDDEN DEFINITIONS

\ медоды, лишь добавляющие смещение к указаному адресу
: (f2addr) ( r: addr d: rec --> adddr ) R> 0x0E - @ + ;
: (f1addr) ( r: addr d: rec --> adddr ) R> 0x09 - @ + ;
: (f0addr) ( r: addr d: rec --> adddr ) R> @ + ;

\ извлечение и сохранение чисел одинарной точности
: (@cell) ( r: addr d: rec --> n ) R> @ + @ ;
: (!cell) ( r: addr d: n rec --> ) R> 0x09 - @ + ! ;

\ извлечение и сохранение чисел длиной в два байта
: (@word) ( r: addr d: rec --> n ) R> @ + W@ ;
: (!word) ( r: addr d: n rec --> ) R> 0x09 - @ + W! ;

\ извлечение и сохранение чисел байтовой разрядности
: (@byte) ( r: addr d: rec --> n ) R> @ + B@ ;
: (!byte) ( r: addr d: n rec --> ) R> 0x09 - @ + B! ;

\ извлечение и сохранение чисел двойной длины
: (@long) ( r: addr d: rec --> n ) R> @ + D@ ;
: (!long) ( r: addr d: n rec --> ) R> 0x09 - @ + D! ;

\ извлечение и сохранение исполнимых адресов
: (@token) ( r: addr d: rec --> n ) R> @ + TOKEN@ ;
: (!token) ( r: addr d: n rec --> ) R> 0x09 - @ + TOKEN! ;

\ извлечение и сохранение строк со счетчиком
: (@str) ( r: addr d: rec --> asc # ) R> @ + COUNT ;
: (!str) ( r: addr d: asc # rec --> ) R> 0x09 - @ + SCOPY ;

\ извлечение и сохранение строк с завершающим нулем
: (@zstr) ( r: addr d: rec --> asc # ) R> @ + ZCOUNT ;
: (!zstr) ( r: addr d: asc # rec --> ) R> 0x09 - @ + SWAP 1 + CMOVE ;

\ создать описатель записи Name с полем указанной длины #
\ и методами работы: std to from
: MkRec: ( disp / Name std to from --> disp )
:
COMPILE NEXT-WORD COMPILE SHEADER
COMPILE COMPILE ' COMPILE,
COMPILE DUP COMPILE , LIT, COMPILE +
COMPILE COMPILE ' COMPILE,
COMPILE COMPILE ' COMPILE,
[COMPILE] ;
;

ALSO FORTH THIS

\ описатели полей различного типа:
\ EXECUTE TO FROM
CELL MkRec: Cell[] (@cell) (!cell) (f2addr)
2 MkRec: Word[] (@word) (!word) (f2addr)
1 MkRec: Byte[] (@byte) (!byte) (f2addr)
2 CELLS MkRec: Long[] (@long) (!long) (f2addr)
TOKEN MkRec: Token[] (@token) (!token) (f2addr)
SCNT# MkRec: String[] (@str) (!str) (f2addr)
1 MkRec: ZStr[] (@zstr) (!zstr) (f2addr)
\
: Fld[] ( disp # / name --> disp ) NEXT-WORD SHEADER
COMPILE (f0addr)
OVER , +
COMPILE (f1addr)
COMPILE (f2addr) ;

ALIAS Cell[] Addr[]

\ начать описание структуры с именем name
\ n - число, от которого отсчитывается смещение поля
: Struct ( n / name --> addr n n )
NEXT-WORD <| [CHAR] / KEEP KEEPS |> CREATED HERE 0 , SWAP DUP
DOES> @ ;

\ закончить описание структуры
: /Struct ( addr u disp --> ) RANGE SWAP ! ;

RECENT

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

0 Struct BLABLA
Cell[] 1st
Word[] 2st
Byte[] 3st
Token[] 4st
Long[] 5st
String[] 6st
20 Fld[] 7st
ZStr[] 8st
20 Fld[] 9st
/Struct

CREATE sample /BLABLA ALLOT

-1 sample TO 1st
-1 sample TO 2st
-1 sample TO 3st
' NOOP sample TO 4st
-1 -1 sample TO 5st
s" sample string" sample TO 6st
s" zero end string" sample TO 8st

sample 1st -1 <> THROW
sample 2st 65535 <> THROW
sample 3st 255 <> THROW
sample 4st ' NOOP <> THROW
sample 5st -1 <> THROW -1 <> THROW
sample 6st s" sample string" COMPARE 0 <> THROW
sample 8st s" zero end string" COMPARE 0 <> THROW
}test
</pre>

в данном случае по-умолчанию поля возвращают свои значения, а присвоение значений и получение адреса полей производятся с помощью слов TO и FROM

Автор:  mrack_ [ Ср май 27, 2009 15:22 ]
Заголовок сообщения: 

пример прозрачного кода, красиво

Автор:  вопрос [ Ср май 27, 2009 17:40 ]
Заголовок сообщения: 

Да, всё замечательно, но насколько это переносимо:
такая работа со строками разве не исключительно форк-овская ?

Автор:  mOleg [ Ср май 27, 2009 18:28 ]
Заголовок сообщения: 

вопрос писал(а):
Да, всё замечательно, но насколько это переносимо:

для СПФа портируемо :)

Автор:  вопрос [ Ср май 27, 2009 21:49 ]
Заголовок сообщения: 

должно быть портируемо под стандарт

Автор:  vikt [ Чт май 28, 2009 12:27 ]
Заголовок сообщения: 

mrack_ писал(а):
пример прозрачного кода, красиво


+1 Много программ есть на паскале использующие структуры,
расчитываю перекодить на форт.

Автор:  mOleg [ Пт май 29, 2009 14:39 ]
Заголовок сообщения: 

вопрос писал(а):
должно быть портируемо под стандарт

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

Автор:  вопрос [ Пт май 29, 2009 17:00 ]
Заголовок сообщения: 

Цитата:
уже не вижу (для себя)
в некоторых моментах мне даже поддержку стандарта делать не выгодно (урезаю возможности без видимой пользы)

:shock: :shock:
уже - это " от когда"?
что именно тут имеется ввиду - что не выгодно?

Автор:  mOleg [ Пт май 29, 2009 18:19 ]
Заголовок сообщения: 

вопрос писал(а):
уже - это " от когда"?

сейчас уже 8)

вопрос писал(а):
что именно тут имеется ввиду - что не выгодно?

в скобках отвечено.

Автор:  вопрос [ Пт май 29, 2009 19:56 ]
Заголовок сообщения: 

Всё, стандарт пал под натиском ...
:) Жаль, как же переносимость? :D

Автор:  mOleg [ Пт май 29, 2009 20:02 ]
Заголовок сообщения: 

вопрос писал(а):
Жаль, как же переносимость?

В том то и прикол, что стандарт ничего такого не обеспечивает и даже не обещает 8(

Автор:  mOleg [ Сб май 30, 2009 19:49 ]
Заголовок сообщения: 

кстати, со структурами вообще несколько вопросов возникает.
1) хранить ли поля структур в общем пространстве имен (базовом словаре) либо для каждой структуры делать отдельное
2) на сколько сложные структуры поддерживать (можно очень просто, как сделано в СПФе c: -- и CONSTANT ; а можно как начале топика)
3) хранить ли вообще имена структур после сборки кода
4) автоматизация импорта структур из хидеров (сишных, как наиболее доступных)

ни на один из пунктов я дать окончательного ответа не могу (получается что и так бывает надо и этак)
поэтому хочется какую-то выдумать универсальную синтаксическую конструкцию, позволяющую делать и так и этак, при этом не городить слишком много.
Сейчас у меня самого 4 варианта:
vocs/ struct.fts - с упрятыванием полей внутрь словарей (изолированные пространства имен)
memory/ fld.fts - чуточку более сложные, чем СПФовские, но по сути такие же простые
memory/ ns.fts - то, что представлено в начале данного топика (сложновато по сравнению с предыдущими)
и набросок .\samples\sketches\typedef.fts для импорта хидеров предназначенный (сложновато оно получается)

а в итоге бы это все слить в один (два, если с учетом импорта хидеров) вариант...

Автор:  garbler [ Ср июн 03, 2009 20:19 ]
Заголовок сообщения: 

factor использует макросы, которыми генерирует требуемый код, см. в направлении functor:
(правда, название для слова он выбирал, чтобы специально дразнить функциональщиков, это не настоящий функтор)

обзорно применение можно глянуть здесь (особо не вдаваясь в детали)
http://factor-language.blogspot.com/search?q=functor%3A

в чём там суть - всё разворачивается в отдельные слова (вместе с операциями доступа к полям)

Автор:  вопрос [ Пт июн 05, 2009 10:03 ]
Заголовок сообщения: 

Цитата:
хранить ли вообще имена структур после сборки кода
если для отладки понадобится поставить какой-либо эксперимент ...

Автор:  _Harry [ Вс июн 07, 2009 12:05 ]
Заголовок сообщения: 

mOleg писал(а):

ни на один из пунктов я дать окончательного ответа не могу (получается что и так бывает надо и этак)
...

Дык пусть и будет и так и этак. Кто мешает подключить/отключить нужную библиотеку.
Кстати действительно имеет смысл сделать что то вроде fld.fts, но без сохранения имен полей и размера структуры в коде. Точнее лучше сделать чтобы это было опциями одной билиотеки типа DEBUG/RELEASE.
Мне так вот кажется :shuffle;

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