Substituição de código quente em erlang

Eu estou trabalhando no meu primeiro projeto real em erlang, no entanto, este código é simplificado por brevidade. Eu quero ser capaz de carregar uma versão mais recente de um arquivo no meu projetoremotamente enquanto está correndo. Eu li sobre o uso de um comportamento comogen_server ougen_fsm que tem isso de graça. Embora isso possa alcançar o resultado, quero usá-lo para aprender como fazê-lo, e não apenas fazê-lo. Eu li os docs sobresubstituição de códigoe pouco da LYSE sobreCódigo quente amorosoentre outras coisas, mas não consegui encontrar nada que funcione para o que estou fazendo, então aqui está a ideia básica.

-module(reloading).

-export([loop/0]).

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

Estou simplesmente dando voltas com a ideia de que posso enviar a mensagemupgrade e carregará uma versão mais nova do código.

$ 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

Neste ponto eu mudo 10 linhas paraio:format("I have changed this!~n"),

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

Eu estou esperando issohello ligue para imprimirI have changed this! nãoThis is a test. Eu sei que posso simplesmente ligarc(reloading). e ter esse trabalho da maneira esperada, mas estou tentando enviar ao projeto uma mensagem em vez de atualizar manualmente o código. Então, onde está minha desconexão? O que estou fazendo de errado, que eu deveria estar fazendo para carregar este código? Como mencionado anteriormente, estou procurando uma solução não-OTP em prol da educação.

questionAnswers(4)

yourAnswerToTheQuestion