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

триггеры
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2786
Страница 1 из 1

Автор:  mOleg [ Сб дек 24, 2011 16:58 ]
Заголовок сообщения:  триггеры

родилась сегодня такая штука:
source file: trigger.fts
\ 24.12.2011 ~mOleg
\ Copyright [C] 2011 mOleg mOlegg@ya.ru
\ триггеры

\ исполнить одну из предопределенных функций
: (prf) ( --> ) AR> [ TOKEN 2 * ] LITERAL + DUP @ + CELL + PERFORM ;

\ переключить состояние триггера
: (tgl) ( --> ) AR> TOKEN + DUP @ ADDR XOR SWAP ! ;

\ определить состояние переключателя
: (stt) ( --> ) AR> @ ADDR = ;

\ создать переключатель, выполняющий одну из двух возможных функций: on / off
: TRIGGER ( 'on 'off --> )
HEADER
COMPILE (prf)
COMPILE (tgl)
COMPILE (stt)
0 ,
A,
A,
;CREATE ;

\ переключить состояние триггера
: TOGGLE ( / name --> ) [COMPILE] TO ; IMMEDIATE

\ проверить состояние переключателя
: CHECK ( / name --> ) [COMPILE] FROM ; IMMEDIATE

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

:> a 987097 ;
:> b 833124 ;

a b TRIGGER TST

1234 TST 1234 b EXECUTE D= 0 = THROW
TOGGLE TST
1234 TST 1234 a EXECUTE D= 0 = THROW
TOGGLE TST
1234 TST 1234 b EXECUTE D= 0 = THROW

CHECK TST THROW
TOGGLE TST
CHECK TST 0 = THROW
}test

Автор:  gudleifr [ Сб дек 24, 2011 17:30 ]
Заголовок сообщения:  Re: триггеры

mOleg писал(а):
...триггеры...

1. Зачем называть триггером вещь, которая не работает как триггер? Насколько я понимаю, триггер - штука, которая что-то меняет (в себе или снаружи) при возникновении внешнего события, а совсем не "переменная - указатель на функцию".
2. Опять куча новых (конечно, для меня) слов. Может, если мы постулировали невозможность договориться на уровне языка, все-таки, обмениваться алгоритмами в более общепринятой форме?
3. Изобретать фичу ради фичи, имхо, бессмысленно. Надо бы пример полезного применения. Правда, в силу (2) я, скорее всего, совсем ничего в нем не пойму.

Автор:  mOleg [ Сб дек 24, 2011 18:56 ]
Заголовок сообщения:  Re: триггеры

gudleifr писал(а):
1. Зачем называть триггером вещь, которая не работает как триггер?

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

Код:
: a ." one" ;
: b ." two" ;
VECT SOMETHING

и где-то в коде писать:
Код:
FROM SOMETHING ['] a = IF ['] b IS SOMETHING ELSE ['] a IS SOMETHING THEN

и таких мест много, да и самих SOMETHING не одно. При этом, действия таки только два возможных. Заводить на каждое из них отдельное определение нудно, итак кода уже много.

gudleifr писал(а):
Опять куча новых (конечно, для меня) слов.

странно, а чего там непонятного-то?

gudleifr писал(а):
Надо бы пример полезного применения.

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

Автор:  gudleifr [ Сб дек 24, 2011 19:10 ]
Заголовок сообщения:  Re: триггеры

mOleg писал(а):
...

Вроде понял, спасибо.
mOleg писал(а):
пример, ну, скажем, есть два варианта отображения объемного изображения:
1) каркасное
2) нормальное
и нужно между ними туда сюда переключаться по необходимости нажимая одну кнопку, при этом, переключать можно из кучи мест (не из одного), и, главное, других альтернатив быть не должно.

Ну, здесь, скорее, обычный DOER, т.е. никак не триггер, а "указатель на функцию".
Код:
DOER FUNC DOER SWITCH DOER ON!
: OFF! MAKE FUNC DO-B1 DO-B1 ... DO-Bm ;AND MAKE SWITCH ON! ;
MAKE ON! MAKE FUNC DO-A1 DO-A2 ... DO-An ;AND MAKE SWITCH OFF! ;

Кстати, "настоящие триггера" действительно иногда нужны. Вот, например, что может понадобиться для кибернетических моделей:
1) нейрон, реагирующий на превышение порога посылкой сигнала и переходом в режим восстановления (т.к. параметры всех этих возбуждений/затуханий будут размазаны по разным таблицам, то здесь, скорее будет голая переадресация).
2) тоже самое, но для перехода от честного квантования времени в режим от события - к событию. Вероятностное событие переключения, генерация отложенного события...
3) триггер, как часть гомеостата, различающий возмущение устранимое без изменения состояния от возмущения, вызывающего перерасчет состояний.
Понятно, пока проект подобной лабуды не будет доведен до ума, говорить о том, как будут выглядеть триггеры для нее, не имеет смысла. Но одно можно постулировать. Изобретать "триггер" заранее - бесполезно.

Автор:  mOleg [ Сб дек 24, 2011 19:26 ]
Заголовок сообщения:  Re: триггеры

gudleifr писал(а):
т.е. никак не триггер

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

правда, в моем случае не электронное устройство.

gudleifr писал(а):
обычный DOER

С этого чуда я не тащусь никак, не по вкусу он мне.
Да и всеравно мой вариант получается короче в итоге.

Код:
:> a ." включено" ;
:> b ." выключено" ;

a b TRIGGER свет
...
TOGGLE свет
...
где-то свет
...
TOGGLE свет
..
где-то рас свет
..
CHECK свет

Автор:  gudleifr [ Сб дек 24, 2011 19:36 ]
Заголовок сообщения:  Re: триггеры

mOleg писал(а):
правда, в моем случае [триггер] не электронное устройство.

Я больше имел в виду другие "триггера" - процедуры поддержки целостности БД, связанные с событиями модификации БД.
mOleg писал(а):
С этого чуда [DOER] я не тащусь никак, не по вкусу он мне.
Да и всеравно мой вариант получается короче в итоге.

Зато, DOER гораздо универсальнее (и короче). Допустим, пяток строк на определении конкретного триггера Вы сэкономите, но сколько потеряете на обращениях к нему? Сама постановка Вами примера - глобальный переключатель - делает бессмысленной экономию места на определении в ущерб гибкости.
P.S. Опять мы сползли в "нравится"/"не нравится".

Автор:  mOleg [ Сб дек 24, 2011 19:40 ]
Заголовок сообщения:  Re: триггеры

gudleifr писал(а):
Допустим, пяток строк на определении конкретного триггера Вы сэкономите, но сколько потеряете на обращениях к нему?

В каком смысле?

gudleifr писал(а):
P.S. Опять мы сползли в нравится/не нравится.

Такова жизнь. То, что не нравится не сподручно использовать.

Автор:  gudleifr [ Сб дек 24, 2011 19:43 ]
Заголовок сообщения:  Re: триггеры

mOleg писал(а):
В каком смысле?
TOGGLE свет
длиннее и дольше интерпретируется, чем
SWITCH
плюс, в Вашем случае возможна путаница с установкой начального состояния

Автор:  mOleg [ Сб дек 24, 2011 19:49 ]
Заголовок сообщения:  Re: триггеры

gudleifr писал(а):
TOGGLE светдлиннее и дольше интерпретируется, чем

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

Автор:  Alexander [ Пн дек 26, 2011 20:23 ]
Заголовок сообщения:  Re: триггеры

Всё имеет право на существоание. Но применяем мы это или нет,- тут дело каждого.
На практике всё равно индексированная табилца токенов будет приятней. Хотя с автоматизацией чего-то, что решено здесь новой конструкцией будет сложней.

Автор:  mOleg [ Вт дек 27, 2011 15:45 ]
Заголовок сообщения:  Re: триггеры

Alexander писал(а):
На практике всё равно индексированная табилца токенов будет приятней.

нет.
Я все получившиеся переключатели скидываю в один словарь, оставляю там только TOGGLE , и позволяю пользователю их переключать в ему угодном порядке и комбинации. Если комбинацией переключений систему из строя вывести нельзя - она будет устойчивой, а вот если я открою возможность присваивать VECT переменной или какой-то индексированной таблице произвольные cfa (т.е. оставлю интерфейс открытым), то натворят такого...

Автор:  mOleg [ Пн апр 09, 2012 17:52 ]
Заголовок сообщения:  Re: триггеры

развитие идеи (перебор вариантов)
source file: round.fts
\ 07.04.2012 ~mOleg
\ Copyright [C] 012 mOleg mOlegg@ya.ru
\ выбор из списка обработчиков (по мотивам trigger.fts)

ALSO HIDDEN DEFINITIONS

\ выбрать метод согласно значению, сохраненному в поле данных
: {f} ( r: addr --> )
R> [ TOKEN 3 * ] LITERAL +
DUP @ ABS OVER CELL + @ MOD ADDR * [ 2 CELL * ] LITERAL +
+ A@ EXECUTE ;
\ сместить указатель влево на след ф-цию
: {r} ( r: addr --> ) -1 R> [ TOKEN 2 * ] LITERAL + +! ;
\ сместить указатель вправо на пред. ф-цию.
: {l} ( r: addr --> ) 1 R> TOKEN + +! ;
\ вернуть адрес, где хранится номер текущей ф-ции
: {p} ( r: addr --> addr ) R> ;

ALSO FORTH DEFINITIONS

\ определитель конца перечисления
: ;ROUND ; IMMEDIATE

\ создает определение с именем name, связанным со списком слов, находящихся
\ в перечислении вслед за name вплодь до ;ROUND
\ в последствии при упоминании name будет выполняться одно из перечисленных
\ слов
: ROUND: ( / name --> )
HEADER
COMPILE {f}
COMPILE {r}
COMPILE {l}
COMPILE {p}
0xFFFFFF , \
HERE >R
0 , \
BEGIN NEXT-WORD *WHILE
SFIND *IF ELSE ERROR" Слово не найдено!" THEN
imm_word = WHILENOT
A, 1 R@ +!
REPEAT ['] ;ROUND =
IFNOT ERROR" Ожидается завершающий ;ROUND" THEN
THEN RDROP ;CREATE ;

\ методы работы:
\ прочесть содержимое VALUE переменной
: @pos ( / name --> xt ) ' [ 3 TOKEN * LIT, ] + REGULAR ; IMMEDIATE
ALIAS TO << IMMEDIATE
ALIAS FROM >> IMMEDIATE

PREVIOUS RECENT

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


: one ." ?111? " ;
: two ." ?222? " ;
: thr ." ?333? " ;
: fou ." ?444? " ;
: fif ." ?555? " ;

ROUND: TEST one two thr fou fif ;ROUND

TEST
<< TEST TEST << TEST TEST << TEST TEST
>> TEST TEST >> TEST TEST >> TEST TEST

}test

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

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