13 Stimmen

Erlang: Wie kann ich eine anonyme Funktion innerhalb des Körpers referenzieren?

Unter Erlang gibt es eine Möglichkeit, auf die gerade ausgeführte Funktion zu verweisen)?

Das wäre nützlich, um eine Endlosschleife zu erzeugen:

spawn(fun() -> do_something, this_fun() end)

In JavaScript arguments.callee tut genau das, siehe die Spezifikation auf MDC .

Bearbeiten, um auf die Frage "Warum sollten Sie das tun?" zu antworten: Hauptsächlich aus Neugierde; es ist auch nützlich, einen Zeitgeber für die Erstellung eines Prorotyps zu definieren:

Self = self(),
spawn(fun() -> Self ! wake_up, receive after 1000 -> nil end, this_fun() end),
%% ...

28voto

legoscia Punkte 38918

In Erlang/OTP 17.0-rc1 können Sie dafür einen benannten Spaß verwenden:

1> Self = self(),
1> Fun = fun ThisFun() ->
             Self ! wake_up,
             receive after 1000 -> nil end,
             ThisFun()
         end.
#Fun<erl_eval.44.71889879>
2> spawn(Fun).
<0.35.0>
3> flush().
Shell got wake_up
Shell got wake_up
Shell got wake_up
ok

In früheren Versionen gibt es keine Möglichkeit, genau das zu tun. Sie konnten die Funktion selbst als Argument übergeben:

Self = self(),
Fun = fun(ThisFun) ->
          Self ! wake_up,
          receive after 1000 -> nil end,
          ThisFun(ThisFun)
      end
spawn(fun() -> Fun(Fun) end),
%% ...

7voto

zakovyrya Punkte 9341

Wenn Sie die Dinge ein wenig verdrehen wollen:

Y = fun(M,B) -> G = fun(F) -> M(fun() -> (F(F))() end, B) end, G(G) end.
spawn(Y(fun(F, ParentPid) -> fun() -> ParentPid ! wake_up, receive after 1000 -> ok end, F() end end, self())).

Spülen Sie die Nachrichten ein paar Mal, um das Ergebnis zu sehen:

flush().

Natürlich ist Y nützlicher, wenn man es in einer Art Bibliothek ablegt. Sie können auch diesen Beitrag auf Y Combinators finden: http://bc.tech.coop/blog/070611.html recht interessant

3voto

Christian Punkte 9358

Die Erlang-Sprache bietet keine Möglichkeit für anonyme Funktionen, auf sich selbst zu verweisen, aber es gibt ein Gerücht, dass Core Erlang (eine zwischengeschaltete, aber offizielle Darstellung in den Compilerphasen) eine solche Funktion hat.

Ich weiß nicht, warum ich das weiterleite, aber wenn Sie Core Erlang in einer DSL oder ähnlichem generieren, ist das etwas, das in Reichweite ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X