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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: расширенное управление словарями: Unit:
СообщениеДобавлено: Пт фев 27, 2009 20:59 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Всвязи с тем, что тема уже не однократно поднималась, и мне уже не одному пришлось лично объяснять, как можно более удобно работать со словарями, решил завести отдельную тему.

Для начала небольшой экскурс.
Словари в Форте удобны тем, что можно в них упрятывать имена, удобным образом их группировать. При этом работа со словарями достаточно громоздка:
VOCABULARY SAMPLE
ALSO SAMPLE DEFINITIONS
....
PREVIOUS DEFINITIONS

так выглядит классический метод использования словарей. То есть создается словарь (в текущем словаре), он кладется на вершину контекста, делается текущим, после чего добавляются необходимые определения, и словарь "закрывается" то есть удаляется из контекста, и текущим делается предыдущий словарь.
Понятно, что в случае необходимости использования слов из какого-либо словаря его необходимо положить в контекст, что иногда в коде выливается в следующую последовательность:

... [ ALSO VocName ] ImportName [ PREVIOUS ] ...

что встречается может и не часто, но достаточно неудобно.

Для решения этой проблемы существует несколько решений, к примеру в СПФ есть библиотека spf_modules.f (есть и другие).
Проблема как всегда в том, чтобы не усложняя сильно реализацию, предоставить удобный и полезный интерфейс, который бы однозначно работал и следовал духу Форта.

Далее предлагается следующий синтаксис:
Unit: VocName \ создать словарь с именем VocName сделать его текущим и контекстным, 
\ то есть все слова после его определения пойдут уже в словарь VocName

Sub Unit: NestedVoc \ создать вложенный словарь с именем NestedVoc

: simple ." простое имя не влияющее на контекст" ;
F: recoil ." имя со сложным поведением, влияющее контекст" ;F
EndUnit

EndUnit


итак, далее вне зависимости от состояние переменной STATE поведение слов будет одинаковым. Последовательность:
... VocName NestedVoc simple recoil ...
приведет к вызову(либо компиляции в зависимости от STATE) слов simple recoil из вложенного словаря, при этом, контекст на выходе окажется неизменным. Иными словами словари становятся словами немедленного исполнения и откаты [ PREVIOUS ] происходят автоматически при использовании слов, определенных через F: ... ;F , причем глубина отката определяется тем, было ли перед Unit: указано Sub.

\ 21.02.2009 ~mOleg (уже не помню какая редакция - много их было!)
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ работа с вложенными словарями

math/ useful.fts
branch/ handlers.fts

ALSO HIDDEN DEFINITIONS
VOCABULARY UNITS
UNITS DEFINITIONS

USER chain

\ в зависимости от состояния системы либо исполнить указанное слово,
\ либо добавить его в текущее определение
\ удалить верхний словарь из контекста
: using ( xt --> ) PREVIOUS
state IF COMPILE, ELSE EXECUTE THEN ;

\ начать создание метода с указанным именем asc #
: (F) ( asc # --> ) S: [COMPILE] <: ;

\ создать словарь-контейнер с указанным именем
: container ( asc # --> vid )
DDUP <| [CHAR] ( KEEP KEEPS [CHAR] ) KEEP |> SVOCAB
ALSO LATEST LINK>C EXECUTE CONTEXT A@ PREVIOUS A>L
CREATED 0 chain CHANGE , AL@ A, IMMEDIATE
['] L> >R
DOES> DUP @ IFNOT ALSO THEN
CELL + A@ WITH ;

ALSO FORTH THIS

\ сообщает о логической вложенности контейнера
: Sub ( --> ) chain ON ;

\ создать контейнер, перенаправить компиляцию в него
: Unit: ( / name --> )
NEXT-WORD container
ALSO WITH DEFINITIONS ;

\ завершить работу с контейнером, откатить контекст на предыдущее состояние,
\ вернуть текущий словарь
: EndUnit ( --> ) RECENT ;

\ начать описание метода
: F: ( / name --> ) NEXT-WORD (F) ;

\ завершить описание метода
: ;F ( --> )
[COMPILE] ;> COMPILE using
[COMPILE] ; IMMEDIATE
; IMMEDIATE

RECENT

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 27, 2009 21:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вот один из примеров использования:
\ 2008-10-22 ~mOleg ~Pretorian
\ Сopyright [C] 2008 mOleg mininoleg@yahoo.com , Pretorian pi@alarmomsk.ru
\ текущее время: чтение и отображение

util/ unit.fts
util/ dmtrans.fts

WINAPI: GetLocalTime KERNEL32.DLL ( addr --> addr )
WINAPI: GetSystemTime KERNEL32.DLL ( addr --> addr )

Unit: Time{

\ буфер для хранения данных в USER области.
USER-CREATE TimeBuff 0x10 USER-ALLOT

\ сохранить в буфер локальное/системное время
: Local ( --> ) TimeBuff GetLocalTime DROP ;
: System ( --> ) TimeBuff GetSystemTime DROP ;

\ взять из буфера нужное значение
: year ( --> u ) TimeBuff W@ ;
: month ( --> u ) TimeBuff 0x2 + W@ ;
: dayofweek ( --> u ) TimeBuff 0x4 + W@ ;
: day ( --> u ) TimeBuff 0x6 + W@ ;
: hour ( --> u ) TimeBuff 0x8 + W@ ;
: minute ( --> u ) TimeBuff 0xA + W@ ;
: second ( --> u ) TimeBuff 0xC + W@ ;
: milisec ( --> u ) TimeBuff 0xE + W@ ;

\ преобразовать год месяц день в символьное представление
: date> ( y m d --> asc # )
0 0x0A {# # # [CHAR] - HOLD DROP
# # [CHAR] - HOLD DROP
# # # # #> ;

\ преобразовать час минута секунда в символьное представление
: time> ( h m s --> asc # )
0 0x0A {# # # [CHAR] : HOLD DROP
# # [CHAR] : HOLD DROP
# # #> ;

\ преобразовать значения деньНедели месяца месяц в символьное представление
: day> ( w d m --> asc # )
0x0A {# [CHAR] . HOLD Month 3 UMIN HOLDS
BL HOLD 0 # # BL HOLD DDROP
[CHAR] . HOLD WeekDay 3 UMIN HOLDS
#} ;

F: } ;F
EndUnit

\ отобразить текущую дату
: ~DATE ( --> ) Time{ Local year month day date> } TYPE ;

\ Отобразить текущее время
: ~TIME ( --> ) Time{ Local hour minute second time> } TYPE ;

\ Отобразить текущий день недели
: ~DAY ( --> ) Time{ Local dayofweek day month day> } TYPE ;

\ Отобразить текущие дату и время
: ~DATETIME ( -> ) ~DATE 2 SPACES ~TIME ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

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


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

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


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

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