Горячая замена кода в эрланге

Я работаю над своим первым реальным проектом на эрланге, однако этот код упрощен для краткости. Я хочу иметь возможность загружать более новую версию файла в мой проектremotely пока он работает. Я читал об использовании поведения, подобногоgen_server или жеgen_fsm который имеет это бесплатно. Хотя это может привести к результату, я хочу использовать это, чтобы узнать, как это сделать, а не просто сделать это. Я прочитал документы озамена кодаи немного о LYSEГорячая любовь к кодусреди прочего, но я не смог найти ничего, что бы работало для того, что я делаю, поэтому вот основная идея.

-module(reloading).

-export([loop/0]).

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

Я просто зациклен на мысли, что могу отправить сообщениеupgrade и он загрузит более новую версию кода.

$ 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

На этом этапе я меняю 10 строк наio:format("I have changed this!~n"),

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

Я ожидаю этогоhello позвонить в печатьI have changed this! неThis is a test, Я знаю, я могу просто позвонитьc(reloading). и я ожидаю, что эта работа будет работать ожидаемым образом, но я хочу отправить фактическому проекту сообщение, а не обновлять код вручную. Так где же мое отключение? Что я делаю не так, что я должен делать для горячей загрузки этого кода? Как упоминалось ранее, я ищу не-OTP решение для образования.

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

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