Ich sehe Funktionen, die einen Empfangsblock umschließen, der rekursiv scheinbar nicht in der Schwanzposition überall im elixir Beispielcode aufgerufen wird. Zum Beispiel:Tail-Rekursion in einem Empfangsblock
defmodule A do
def loop do
receive do
:ping ->
IO.puts "Received :ping"
loop # <- Tail position?
:pong ->
IO.puts "Received :pong"
loop # <- Also Tail position?
after
5000 ->
loop # <- Also Tail position?
end
loop # <- Also Tail position?
end
end
Erhalten ein spezielles Konstrukt, das für Endpositionen am Ende aller Match-Blöcke optimiert? Wenn ja, gilt es, wenn der Empfangsblock einen after
Block hat? Was passiert, wenn nach dem Empfangsblock Code in der Funktion ist?
Awesome, Dank sehen! Diese Erlang Docs waren genau das, wonach ich suchte. – greggreg
Ich gehe davon aus, dass das gleiche für "case" usw. gilt? Dass eine Funktion, die rekursiv aus einer Bedingung in "case" aufgerufen wird, TCO ist, vorausgesetzt, dass nach dem Block nichts aufgerufen wird? – kevlarr
Ja, das sollte auch in diesen Situationen gelten. –