Просто, чтобы понять это прямо в моей голове. Рассмотрим этот примерный бит кода Erlang:
test() ->
receive
{From, whatever} ->
%% do something
test();
{From, somethingelse} ->
%% do something else
test();
end.
Не вызов test(), просто переход?
Я спрашиваю об этом, потому что в C, который мы узнали, если вы выполняете вызов функции, место возврата всегда помещается в стек. Я не могу представить, что это должно быть в случае Erlang, поскольку это приведет к переходу stackoverflow.
В основном. У нас было два разных способа вызова функций: goto и gosub. goto просто управлял потоком программы где-то в другом месте, и gosub вспомнил, откуда вы пришли, чтобы вы могли вернуться.
Учитывая этот способ мышления, я могу легче рассмотреть рекурсию erlang, так как если бы я просто прочитал: test() как goto, тогда нет никакой проблемы.
следовательно, мой вопрос: не erlang просто использовать goto вместо того, чтобы помнить обратный адрес в стеке?
EDIT:
Только для того, чтобы прояснить мою мысль:
Я знаю, что goto может использоваться на некоторых языках, чтобы прыгать повсюду. Но просто suupose вместо выполнения someFunction() вы также можете сделать: goto someFunction() в первом примере поток возвращается, во втором примере поток просто продолжается в someFunction и никогда не возвращается.
Таким образом, мы ограничиваем нормальное поведение GOTO, просто переходя к точкам начала метода.
Если вы видите так, что вызов рекурсивной функции erlang выглядит как goto.
(на мой взгляд, это вызов функции без возможности вернуться туда, откуда вы пришли). Это именно то, что происходит на примере erlang.