рекурсивные функции Эрланга - это не просто 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 - это вызов функции без возможности возврата туда, откуда вы пришли). Что именно и происходит в примере с эрлангом.

Ответы на вопрос(9)

Ваш ответ на вопрос