即使你的編輯是不尾遞歸:
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