如何根据此代码绘制有限状态机
machine() ->
receive
{add, P} -> receive {X, Y} -> P!(X + Y), machine() end;
{sub, P} -> receive {X, Y} -> P!(X - Y), machine() end
end.
答案 0 :(得分:0)
在fsm的erlang实现中:
递归函数是state
,因此您的fsm仅具有一个状态,即machine
,它甚至听起来都不像状态名。相反,“机器”或“计算器”将是fsm(模块)的更合适的名称。
收到的消息是event
。
action
是为响应事件而调用的函数。
如果您查看LYSE,则您的fsm本质上就是猫。在您的情况下,有两条返回原始状态的路径,每个路径都需要两个事件。所以,像这样:
但是,也许您的计算器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()状态。