只是想直截了当.考虑这个Erlang代码的例子:
test() ->
receive
{From, whatever} ->
%% do something
test();
{From, somethingelse} ->
%% do something else
test();
end.
Run Code Online (Sandbox Code Playgroud)
是不是test()调用,只是一个转到?
我问这个是因为在C中我们了解到,如果你进行函数调用,返回位置总是放在堆栈上.我无法想象这里的Erlang一定是这种情况,因为这会导致堆栈溢出.
基本的.我们有两种不同的调用函数的方法:goto和gosub.goto刚刚把程序流引导到其他地方,gosub记得你来自哪里,所以你可以回来.
考虑到这种思维方式,我可以更容易地看一下erlang的递归,因为如果我只读:test()作为goto,那么根本就没有问题.
因此我的问题:不是erlang只是使用goto而不是记住堆栈上的返回地址?
编辑:
只是为了澄清我的观点:
我知道goto可以用在某些语言中来跳过这个地方.但是,只是suupose而不是someFunction()你也可以这样做:在第一个例子中返回流返回的一些函数(),在第二个例子中,流程只在someFunction中继续并且永远不会返回.
所以我们通过跳转到方法起点来限制正常的GOTO行为.
如果你这样看,那么erlang递归函数调用看起来就像一个goto.
(在我看来,goto是一个函数调用,无法返回你来自的地方).这正是erlang示例中正在发生的事情.