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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: слова в словах или создание простых обработчиков внутри слов
СообщениеДобавлено: Пн янв 05, 2009 21:44 
Не в сети
Moderator
Moderator
Аватара пользователя

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

: Пример ( list --> ) <: ToNameField COUNT TYPE SPACE ;> WithList ;

'Пример' распечатает содержимое списка list c помощью кода
<: находящегося внутри ;> , который будет вызван многократно (столько раз,
сколько у списка элементов). В одном определении может быть сколько угодно
таких безымянных обработчиков. Более простые и понятные примеры приведены
ниже:
: test ( --> )
." aaaa "
<: ." bbbb " ;>
." cccc "
EXECUTE ;

: sample ( flag --> )
<: ." select one" ;>
<: ." select two" ;>
ROT IF SWAP THEN DROP EXECUTE
;


Сам код

\ 2009-01-04 ~mOleg
\ Сopyright [C] 2008 mOleg mininoleg@yahoo.com
\ создание обработчиков внутри слов

\ обойти следующий код, выложив его адрес на вершину стека данных
: (;>) ( --> addr ) R> DUP A@ >R ADDR + ;

\ запомнить место перехода для вызова метода, начать описание метода
: <: ( --> dest id )
COMPILE (;>) HERE 0 A,
NOTICE" ожидается завершающий ;>"
; IMMEDIATE

\ завершить создание метода, разрешить переход вперед для (>>)
: ;> ( dest id --> )
NOTICE" ожидается завершающий ;>" OVER <> IF THROW THEN DROP
RET, ALIGN HERE SWAP A! ; IMMEDIATE


собственно, это почти (как оказалось) аналог LAMBDA{ } от pinka правда RECURSE будет вызывать базовое слово (только вот в devel я не нашел примеров кода с RECURSE внутри LAMBDA{ }, но оно и не нужно: более сложные обработчики стоит оформлять в отдельные словарные статьи.
Ну и соответственно реализация оригинальная, впрочем сложного в реализации обоих вариантов нет.

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


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

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

branch/ handlers.fts

\ начать создание CASE структуры
: CASE ( a --> )
STATE @ IFNOT init: THEN 5 controls +!
[COMPILE] <: ; IMMEDIATE

\ выполнить содержимое за uOF если флаг отличен от нуля
: uOF ( flag --> ) [COMPILE] IF COMPILE DROP ; IMMEDIATE

\ выполнить содержимое за OF если a=b
: OF ( a b --> ) COMPILE OVER COMPILE = [COMPILE] uOF ; IMMEDIATE

\ завершить описание варианта, начатого OF или uOF
: ENDOF ( --> ) [COMPILE] EXIT [COMPILE] THEN ; IMMEDIATE

\ завершить конструкцию CASE
: ENDCASE ( a --> )
?COMP COMPILE DROP [COMPILE] ;> COMPILE EXECUTE
-5 controls +! controls @ IFNOT [COMPILE] ;stop THEN ; IMMEDIATE

\EOF
\ а так можно отложить исполнение CASE структуры, либо, к примеру поймать ошибку
\ только в ней с помощью CATCH !!!
: ENDCASE> ( a --> xt )
?COMP COMPILE DROP [COMPILE] ;>
-5 controls +! controls @ IFNOT [COMPILE] ;stop THEN ; IMMEDIATE

Идея в том, что CASE структура находится внутри <: .. ;> и выход в случае
успеха по EXIT после OF .
То есть структура выбора вырождается в набор IF ... EXIT THEN
то есть более простую конструкцию, по сравнению с классическим CASE
а еще позволяет отложить исполнение CASE структуры или поймать ее по CATCH

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


Последний раз редактировалось mOleg Пн янв 12, 2009 22:20, всего редактировалось 1 раз.

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

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


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

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


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

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