Hot Code Ersatz in Erlang

Ich arbeite an meinem ersten echten Projekt in Erlang. Der Kürze halber ist dieser Code jedoch vereinfacht. Ich möchte eine neuere Version einer Datei in mein Projekt laden könnenentfernt während es läuft. Ich habe gelesen, wie man sich verhältgen_server odergen_fsm das hat dies kostenlos. Während dies das Ergebnis erzielen könnte, möchte ich dies nutzen, um zu lernen, wie man es macht, und nicht nur, um es zu schaffen. Ich habe die Dokumentation gelesenCode-Ersatz, und LYSE ist ein bisschen überHot Code Lieben, unter anderem, aber ich konnte nichts finden, das für das, was ich tue, funktioniert, also hier ist die Grundidee.

-module(reloading).

-export([loop/0]).

loop() ->
    receive
        upgrade ->
            ?MODULE:loop();
        hello ->
            io:format("This is a test~n"),
            loop();
        _ ->
            loop()
    end.

Ich komme einfach auf die Idee, dass ich die Nachricht senden kannupgrade und es wird eine neuere Version des Codes geladen.

$ erl
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
1> c(reloading).
{ok,reloading}
2> Loop = spawn(reloading, loop, []).
<0.39.0>
3> Loop ! hello.
This is a test
hello

An dieser Stelle ändere ich die 10er Linie aufio:format("I have changed this!~n"),

4> Loop ! upgrade.
upgrade
5> Loop ! hello.  
This is a test
hello

Ich erwarte dashello anrufen, um zu druckenI have changed this! nichtThis is a test. Ich weiß, ich kann einfach anrufenc(reloading). Ich möchte dem eigentlichen Projekt eine Nachricht senden, anstatt den Code manuell zu aktualisieren. Wo ist meine Trennung? Was mache ich falsch, dass ich tun sollte, um diesen Code heiß zu laden? Wie bereits erwähnt, suche ich eine Nicht-OTP-Lösung, um mich weiterzubilden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage