Odpovídáte na názor ke článku Programovací jazyk pro dnešní den: Erlang.
Sice po asi roce, ale přece. Tak nevím jestli mám FF tykat, ale asi jo. Ten loader je hezkej. Jen taková drobnost, když si přečteš Making Reliable Systems with Presence of Software Errors od Joe Armstronga a kriticky se podíváš na ten svůj výtvor tak je to pěkné až na jednu věc. Bez put a get by to bylo hezčí :-) Jde čistě jen o to, že to není úplně čisté. Krom toho na přepnutí na nový kód není potřeba ten starý purgovat, stačí když se zavolá plně kvalifikovaná funkce a už to běží na novém kódu. Tedy překompiluješ a můžeš na to zapomenout, dřív nebo později všechny běžící procesy migrtují na nový kód.
-module(starter).
-export([stop/0, start/0, restart/0, bootup/1]).
%% called after recompilation
restart() -> test:run().
stop() ->
case is_pid(whereis(starter)) of
true ->
starter ! stop,
stopped;
_Else ->
already_stopped
end.
start() ->
case stop() of
stopped -> io:format("Starter stopped.~n");
already_stopped -> true
end,
io:format("Starting starter~n"),
Pid = spawn_link(?MODULE, bootup,["."]),
register(starter, Pid).
bootup(Dir) ->
loop(Dir, 2000, none).
loop(Dir, Delay, Modifs) ->
receive
stop ->
exit(normal);
recompiled ->
?MODULE:restart()
after Delay ->
% io:format("watching dir ~p...~n",[Dir]),
Files = filelib:wildcard("*.erl",Dir),
NewModifs = lists:map(fun(File) -> {File, filelib:last_modified(File)} end,Files),
% io:format("---~p~n",[Modifs]),
case NewModifs == Modifs of
true -> true;
false -> recompile(Files)
end
end,
loop(Dir, Delay, NewModifs).
recompile(Files) ->
Recompile = fun(File) ->
Result = compile:file(File),
% Result = code:load(File),
io:format("Compiled: ~p~n",[Result]),
case Result of
{ok, Module} when Module /= starter -> code:purge(Module), code:delete(Module);
_ -> ok
end
end,
lists:foreach(Recompile, Files),
io:format("---Recompiled~n"),
starter ! recompiled.
Vše je řečeno na www.fuxoft.cz
Přečteno 93 215×
Přečteno 84 988×
Přečteno 42 556×
Přečteno 41 292×
Přečteno 37 868×