Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт сен 20, 2018 14:39

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: триггеры
СообщениеДобавлено: Сб дек 24, 2011 16:58 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
родилась сегодня такая штука:
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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 17:30 
mOleg писал(а):
...триггеры...

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 18:56 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
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) нормальное
и нужно между ними туда сюда переключаться по необходимости нажимая одну кнопку, при этом, переключать можно из кучи мест (не из одного), и, главное, других альтернатив быть не должно.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:10 
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) триггер, как часть гомеостата, различающий возмущение устранимое без изменения состояния от возмущения, вызывающего перерасчет состояний.
Понятно, пока проект подобной лабуды не будет доведен до ума, говорить о том, как будут выглядеть триггеры для нее, не имеет смысла. Но одно можно постулировать. Изобретать "триггер" заранее - бесполезно.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:26 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
gudleifr писал(а):
т.е. никак не триггер

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

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

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

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:36 
mOleg писал(а):
правда, в моем случае [триггер] не электронное устройство.

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

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


Последний раз редактировалось gudleifr Сб дек 24, 2011 19:39, всего редактировалось 2 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:40 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
gudleifr писал(а):
Допустим, пяток строк на определении конкретного триггера Вы сэкономите, но сколько потеряете на обращениях к нему?

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:43 
mOleg писал(а):
В каком смысле?
TOGGLE свет
длиннее и дольше интерпретируется, чем
SWITCH
плюс, в Вашем случае возможна путаница с установкой начального состояния


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Сб дек 24, 2011 19:49 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
gudleifr писал(а):
TOGGLE светдлиннее и дольше интерпретируется, чем

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Пн дек 26, 2011 20:23 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Всё имеет право на существоание. Но применяем мы это или нет,- тут дело каждого.
На практике всё равно индексированная табилца токенов будет приятней. Хотя с автоматизацией чего-то, что решено здесь новой конструкцией будет сложней.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Вт дек 27, 2011 15:45 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
Alexander писал(а):
На практике всё равно индексированная табилца токенов будет приятней.

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: триггеры
СообщениеДобавлено: Пн апр 09, 2012 17:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
развитие идеи (перебор вариантов)
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

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

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


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

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


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

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


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

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