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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Автоматы (FSM)
СообщениеДобавлено: Ср фев 14, 2018 16:42 
Не в сети
Moderator
Moderator
Аватара пользователя

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

source file: fsm_.fts
\ 2018.01.27 ~mOleg
\ автоматы состояний (однопоточная реализация)

VOCABULARY FSM
ALSO HIDDEN
ALSO FSM DEFINITIONS

\ вызов ошибки, если не задано состояние после сброса автомата
: (nostate) ERROR" Начальное состояние не задано" ;

\ завершение создания определения
: S; ( --> )
SMUDGE controls @ 1 - ABORT" Несоответствие управляющих структур"
EXIT-ERROR controls OFF
;CREATE [COMPILE] [ ;

\ создать словарь-контейнер с указанным именем, сделать его текущим
: container ( asc # --> )
<| [CHAR] ( KEEP KEEPS [CHAR] ) KEEP |> SVOCAB DROP
ALSO LATEST LINK>C EXECUTE ;

\ методы работы с автоматом
: (perform) ( --> ) R> [ TOKEN 2 * LIT, ] + PERFORM ; \ выполнение
: (init) ( adr --> ) R> TOKEN + DUP A@ SWAP ADDR + A! ; \ инициализация
: (reset) ( --> ) R@ ADDR + A@ R> A! ; \ сброс в начальное состояние

\ создать имя автомата, вернуть адрес к смещению указателя в пользовательскую область
: (automat) ( asc # --> adr )
S:
COMPILE
(perform) \ вызов текущего состояния автомат
COMPILE (init) \ ( state --> ) переключение автомата в указанное состояние
COMPILE (reset) \ сброс автомата в начальное состояние
HERE ['] (nostate) A, \ текущее состояние
['] (nostate) A, \ сброс состояния
S; ;

\ переключить автомат в заданное состояние
: (SW) ( --> ) R@ A@ A@ R> ADDR + A@ A! ;

\ начать описание поведения в заданном состоянии
: (SM) ( r: adr --> adr ) R> A>L s" " S: HERE A>L NOTICE" Контроль баланса" ;

\ создать имя состояния, описатель
: (newstate) ( / name --> )
NEXT-WORD
DDUP <| [CHAR] : KEEP KEEPS |>
S:
COMPILE
(SM) HERE >L ['] (nostate) A,
S;
S:
COMPILE
(SW) L> A, R> A@ A,
S; ;

\ имя, создающее описатели состояний
: (dostate) ( asc # adr --> )
A>L <| KEEPS [CHAR] : KEEP |>
S:
COMPILE
(newstate) AL> A,
S; ;

UNDER PREVIOUS
UNDER DEFINITIONS

\ Создание автомата с именем name
: FSM: ( / name --> )
NEXT-WORD DDUP (automat) A>L
DDUP container DEFINITIONS
AL> (dostate) ;

\ завершение описания состояния
: ;ST [COMPILE] ; ?PAIRS" Контроль баланса" AL> AL> A! ; IMMEDIATE

\ завершение описания состояний автомата
: ;FSM ( / name --> )
' DUP EXECUTE \ тут можно проверить правильность имения (должно быть состояние, а ни что-то другое)
[ TOKEN ADDR + LIT, ] + A@ [ TOKEN 2 * LIT, ] - EXECUTE \ задать начальное состояние автомата
RECENT ;

ALIAS FROM RESET \ сбросить автомат в начальное состояние

UNDER RECENT


\ EOF -- тестовая секция --

FSM: DNA \ создать имя автомата состояний,
\ которое надо будет потом вызывать в рабочем цикле.
\ автоматически создается словарь (DNA),
\ куда пойдут все имена состояний автомата

DNA: ONE \ перечислить все возможные состояния автомата (последовательность не важна)
DNA: TWO \ можно перемешивать с описанием состояний но нельзя ссылаться ранее объявления состояния
DNA: TRE \ автомат можно переводить в произвольное состояние используя имя состояния
DNA: FOU \

\ описать поведение в каждом состоянии и задать возможные переходы между ними
\ в случае упоминания имени состояния (без двоеточия) происходит переключение автомата в новое (заданное) состояние
:ONE ." А" IF ONE ELSE TWO ;THEN 2 OVER = IF CR THEN ;ST
:TWO ." Г" IF FOU ELSE ONE THEN ;ST
:TRE ." Ц" IF ONE ELSE TRE THEN ;ST
:FOU ." Т" IF FOU ELSE TWO THEN ;ST

;FSM ONE \ завершить описание автомата, и задать начальное состояние автомата


math/ mersenne.fts \ ГСЧ

0 SPACE
RESET DNA \ сброс автомата в начальное состояние
BEGIN KEY? WHILENOT \ пока не нажата кнопка

RANDOM 1 AND DNA \ случайное число на вход автомата

1 + 3 MOD *IF ELSE SPACE THEN \ каждый триплет отделять пробелом
50 PAUSE
REPEAT KEY DDROP

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Чт фев 15, 2018 11:47 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Пытаюсь понять, что тут нового по сравнению с описанием через обычное CASE.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Чт фев 15, 2018 12:20 
Hishnik писал(а):
что тут нового по сравнению с описанием через обычное CASE.

ИзображениеТЕМА #74Изображение По большей части, это восстановленная тема этого форума, начавшая с того, что mOleg предложил "именно CASE".


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Чт фев 15, 2018 16:16 
Не в сети
Moderator
Moderator
Аватара пользователя

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

А с этого я как раз начинал 8)

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

Кроме того, в тех же сях я автоматы реализую аналогично:
Код:
void (*being)(void); \ объявление автомата

void workloop(void)
                   {  ...
                       being = stPowerOn;
                       ...
                       while(!restart)
                              {  ...
                                  being();
                                  ...
                              }
                     }

void stPowerOn(void);
...
void stPowerOff(void);


void stPowerOn(void)
                     { ....     
                        being= newState;
                     }


аналогично тут:
Код:
  FSM: being

being: stPowerOn
..
being: stPowerOff

:stPowerOn   ... newState ;

FSM; stPowerOn

: workloop  ...
                 RESET being
                 BEGIN ?Restart WHILENOT
                     
                    being
               
                 REPEAT
                ;


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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Чт фев 15, 2018 16:32 
Не в сети
Moderator
Moderator
Аватара пользователя

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

В свою очередь Name: State
создает сразу два определения
State - переключатель в новое состояние
:State - описатель состояния

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пн фев 19, 2018 12:42 
Кстати, вот реальная задача: пара автоматов, вложенных друг в друга - ИзображениеТЕМА #70, примерно АБЗАЦ #762Изображение.
Сможет ли кто-нибудь написать на FORTH красивее убогого GW-BASIC? Тем более, избежать этапа программирования на бумажке? Или, как обычно, строим "елочки" и "матрешки" на C++, а потом эмулируем на "FORTH со структурами, исключениями и локальными переменными"?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пн фев 19, 2018 19:45 
Не в сети
Moderator
Moderator
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пн фев 19, 2018 20:07 
mOleg писал(а):
простыни на стороннем ресурсе.
А что Вы хотели от реальной задачи? Это же не школьный пример, который кто-то будет для Вас специально причесывать.
Кстати "вменяемо" и "здесь" одновременно - это ненаучная фантастика.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Ср авг 14, 2019 12:21 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Цитата:
Кроме того, в тех же сях я автоматы реализую аналогично:

Я тоже последнее время этот способ активно использую.
Кстати считал себя "изобретателем" :) нигде не встречал описания такого способа реализации автоматов.
Но для малого количества состояний использую swith() case: классический способ он как то нагляднее особенно если на одну страницу все помещается.



За это сообщение автора _Harry поблагодарил: mOleg
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Чт сен 12, 2019 12:05 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 303
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
У Миро Самека (который https://www.state-machine.com ) состояния это - функции/статические методы классов/структур.
Правда у него - идеология "активных объектов".
Не встречал кто-то такого же в реализациях КА на Форте?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пт сен 20, 2019 11:12 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Wlad писал(а):
состояния это - функции/статические методы классов/структур.

Так вроде и тема про это. только класcов нет но это же Forth, зачем они нужны?
(Мне вот даже жалко стало что воспользоваться кодом не могу на работе только Си.)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пт сен 20, 2019 14:44 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Эээ... "состояния - это функции"??? Это как минимум требует пояснения. Это предложение узнавать состояние КА вызовами функций? КА - это, к примеру, настольная лампа с сенсорной кнопкой. У нее два состояния - "включено" и "выключено". Но это не функции.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пт сен 20, 2019 19:29 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 303
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
Hishnik писал(а):
Эээ... "состояния - это функции"??? Это как минимум требует пояснения. Это предложение узнавать состояние КА вызовами функций? КА - это, к примеру, настольная лампа с сенсорной кнопкой. У нее два состояния - "включено" и "выключено". Но это не функции.

Поясню: переменная состояния представляет собой указатель на функцию.
Эта функция - сосредоточие логики обработки входящих событий (через аргумент функции), на основании которых (+ учёта ряда условий) предпринимается решение о (возможной) смене состояния (назначение "хранителю текущего состояния"-указателю на функцию адреса другой функции).
В этой же функции есть участки кода для обеспечения вызова кода при "входе" и "выходе" из состояния и вызов "функций-менеджеров" возможных вложенных состояний.
Для справки: https://www.state-machine.com/psicc2


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пт сен 20, 2019 20:31 
Не в сети
Moderator
Moderator
Аватара пользователя

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

То есть просто нет переменной, хранящей текущее состояние?
Понимаю, как должно работать для одного единственного автомата, а если их пучок?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Автоматы (FSM)
СообщениеДобавлено: Пт сен 20, 2019 20:35 
Не в сети
Moderator
Moderator
Аватара пользователя

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

ну, я тоже не встречал, прижало - пораскинул мыслями 8)
(хотя очень подозреваю, что все же кто-то уже давно придумал раньше)

Так однозначно удобнее, чем:
_Harry писал(а):
Но для малого количества состояний использую swith() case: классический способ он как то нагляднее особенно если на одну страницу все помещается.

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

_Harry писал(а):
(Мне вот даже жалко стало что воспользоваться кодом не могу на работе только Си.)

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

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


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

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


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

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


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

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