Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 21, 2018 17:50

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

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
Сообщения: 6272
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Пытаюсь понять, что тут нового по сравнению с описанием через обычное CASE.


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

Зарегистрирован: Чт дек 31, 2009 18:36
Сообщения: 2105
Откуда: Питер
Благодарил (а): 15 раз.
Поблагодарили: 34 раз.
Hishnik писал(а):
что тут нового по сравнению с описанием через обычное CASE.

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

_________________
Когда я говорю "понимаю" - это не значит, что я согласен, не значит, что я понимаю, и вообще не значит, что я слушаю тебя. /Чарли, "2 1/2 человека"/


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

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

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

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


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

Зарегистрирован: Чт дек 31, 2009 18:36
Сообщения: 2105
Откуда: Питер
Благодарил (а): 15 раз.
Поблагодарили: 34 раз.
Кстати, вот реальная задача: пара автоматов, вложенных друг в друга - ИзображениеТЕМА #70, примерно АБЗАЦ #762Изображение.
Сможет ли кто-нибудь написать на FORTH красивее убогого GW-BASIC? Тем более, избежать этапа программирования на бумажке? Или, как обычно, строим "елочки" и "матрешки" на C++, а потом эмулируем на "FORTH со структурами, исключениями и локальными переменными"?

_________________
Когда я говорю "понимаю" - это не значит, что я согласен, не значит, что я понимаю, и вообще не значит, что я слушаю тебя. /Чарли, "2 1/2 человека"/


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

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

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

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


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

Зарегистрирован: Чт дек 31, 2009 18:36
Сообщения: 2105
Откуда: Питер
Благодарил (а): 15 раз.
Поблагодарили: 34 раз.
mOleg писал(а):
простыни на стороннем ресурсе.
А что Вы хотели от реальной задачи? Это же не школьный пример, который кто-то будет для Вас специально причесывать.
Кстати "вменяемо" и "здесь" одновременно - это ненаучная фантастика.

_________________
Когда я говорю "понимаю" - это не значит, что я согласен, не значит, что я понимаю, и вообще не значит, что я слушаю тебя. /Чарли, "2 1/2 человека"/


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

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


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

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


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

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