Odpověď na názor

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

  • 2. 7. 2007 22:01

    Pichi (neregistrovaný)

    Tak odladěno a vyzkoušeno. Zajímavé, že mě nenapadlo si takovou věcičku taky udělat. Jen tak pro ty rozumbrady aka Dusek. Jen si zkuste napast něco co si skompiluje novou verzi sebe sama a bez přerušení činnosti pokračuje s novou verzí kódu. V erlangu brnkačka viz následující kód.

    Pročištěná verze:

    -module(starter).
    -export([stop/0, start/0, loop/1]).
    -define(dir, ".").
    -define(timeout, 2000).
    %% called after recompilation

    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, loop,[{?dir, ?timeout, none}]),
    register(starter, Pid).

    loop({Dir, Delay, Modifs}=S) ->
    receive
    stop ->
    ok;
    _ -> loop(S)
    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 -> loop(S);
    false -> recompile(Files),
    ?MODULE:loop({Dir, Delay, NewModifs})
    end
    end.

    recompile(Files) ->
    Recompile = fun(File) ->
    Result = compile:file(File),
    io:format("Com­piled: ~p~n",[Result]),
    case Result of
    {ok, Module} -> code:purge(Module),
    code:delete(Mo­dule),
    code:load_file(Mo­dule);
    _ -> ok
    end
    end,
    lists:foreach(Re­compile, Files),
    io:format("---Recompiled~n").