Odpověď na názor

Odpovídáte na názor ke článku Programovací jazyk pro dnešní den: Erlang.

  • 2. 7. 2007 21:05

    Pichi (neregistrovaný)

    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(star­ter)) 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:wildcar­d("*.erl",Dir),
    NewModifs = lists:map(fun(File) -> {File, filelib:last_mo­dified(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("Com­piled: ~p~n",[Result]),
    case Result of
    {ok, Module} when Module /= starter -> code:purge(Module), code:delete(Mo­dule);
    _ -> ok

    end
    end,
    lists:foreach(Re­compile, Files),
    io:format("---Recompiled~n"),
    starter ! recompiled.

Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).