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 ] |
Заголовок сообщения: | |
Цитата: уже не вижу (для себя)
в некоторых моментах мне даже поддержку стандарта делать не выгодно (урезаю возможности без видимой пользы) уже - это " от когда"? что именно тут имеется ввиду - что не выгодно? |
Автор: | mOleg [ Пт май 29, 2009 18:19 ] |
Заголовок сообщения: | |
вопрос писал(а): уже - это " от когда"? сейчас уже вопрос писал(а): что именно тут имеется ввиду - что не выгодно?
в скобках отвечено. |
Автор: | вопрос [ Пт май 29, 2009 19:56 ] |
Заголовок сообщения: | |
Всё, стандарт пал под натиском ... Жаль, как же переносимость? |
Автор: | 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. Мне так вот кажется |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |