即使你的编辑是不尾递归:
loop() ->
receive
{sys, Msg} ->
handle_sys_msg(Msg),
loop();
{From, Msg} ->
Reply = handle_msg(Msg),
From ! Reply,
loop();
_ -> continue
end,
loop().
执行一个功能的顺序是:receive ... end, loop()
。现在,如果你得到一个{sys, _}
消息,loop/0
将从中调用接收,转化执行与上面的顺序进的东西相当于:
loop() ->
receive
loop() ->
receive
...
end,
loop(),
end,
loop() ->
...
的问题是,如果你从内部调用loop()
接收时, VM仍然需要存储返回点以便在receive
之后运行loop()
。
为了让你的函数尾递归的,你需要做的要么:
loop() ->
receive
{sys, Msg} ->
handle_sys_msg(Msg);
{From, Msg} ->
Reply = handle_msg(Msg),
From ! Reply;
_ -> continue
end,
loop().
或
loop() ->
receive
{sys, Msg} ->
handle_sys_msg(Msg),
loop();
{From, Msg} ->
Reply = handle_msg(Msg),
From ! Reply,
loop();
_ -> loop()
end.
凡调用loop()
真的是总是的最后一件事情在做功能。
您的编辑是尾递归,这意味着它不会在堆栈上构建任何东西。 – Lukas 2010-11-18 16:51:21
作为@TERRIBLE建议非常正确地指出你的编辑是不是尾递归 – rvirding 2010-11-19 08:25:42