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