【发布时间】:2019-05-05 03:31:23
【问题描述】:
如何根据这段代码绘制一个有限状态机
machine() ->
receive
{add, P} -> receive {X, Y} -> P!(X + Y), machine() end;
{sub, P} -> receive {X, Y} -> P!(X - Y), machine() end
end.
【问题讨论】:
如何根据这段代码绘制一个有限状态机
machine() ->
receive
{add, P} -> receive {X, Y} -> P!(X + Y), machine() end;
{sub, P} -> receive {X, Y} -> P!(X - Y), machine() end
end.
【问题讨论】:
在 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 有两个事件:
addsubaddition/subtraction states 有一个事件:
{X, Y}加法/减法状态在转换回 selection() 状态之前都执行 display() action。
【讨论】: