В реализации fsm в erlang:
Рекурсивная функция - это state
, поэтому у вашего fsm есть только одно состояние, то есть machine
, которое даже незвучит как государственное название.Скорее, «машина» или «калькулятор» будет более подходящим именем для fsm (модуля).
Полученное сообщение является event
.
action
- это функция, которая вызывается в ответ на событие.
Если вы посмотрите на LYSE Ваш ФСМ по сути является котом.В вашем случае есть два пути назад к исходному состоянию, и каждый путь требует двух событий.Итак, что-то вроде этого:
Но, возможно, ваш калькулятор fsm должен выглядеть примерно так:
-module(calc).
-compile(export_all).
selection() ->
receive
add -> addition();
sub -> subtraction();
_Other -> selection()
end.
addition() ->
receive
{X, Y} ->
display("~w + ~w = ~w", [X, Y, X+Y]),
selection();
_Other -> addition()
end.
subtraction() ->
receive
{X, Y} ->
display("~w - ~w = ~w", [X, Y, X-Y]),
selection();
_Other -> subtraction()
end.
display(Str, Args) ->
io:format(Str ++ "~n", Args).
В этомfsm, есть три states
:
- выбор (выберите операцию)
- сложение
- вычитание
selection state
имеет два события:
add
sub
У addition/subtraction states
есть одно событие:
{X, Y}
Оба состояния сложения / вычитания выполняют display () action
перед переходом обратно в состояние selection ().