Mentre imparo Erlang, sto cercando di risolvere ex. 4.1 ("Un server Echo") dal libro "Erlang Programming" (di O'Reilly) e ho un problema. Il mio codice sembra che:Erlang simple server problem
-module(echo).
-export([start/0, print/1, stop/0, loop/0]).
start() ->
register(echo, spawn(?MODULE, loop, [])),
io:format("Server is ready.~n").
loop() ->
receive
{print, Msg} ->
io:format("You sent a message: ~w.~n", [Msg]),
start();
stop ->
io:format("Server is off.~n");
_ ->
io:format("Unidentified command.~n"),
loop()
end.
print(Msg) -> ?MODULE ! {print, Msg}.
stop() -> ?MODULE ! stop.
Purtroppo, ho alcuni problemi. L'attivazione funziona come previsto, genera un nuovo processo e visualizza il messaggio "Il server è pronto". Ma quando provo a usare la funzione di stampa (come ad esempio echo:print("Some message.").
), ho ottenuto dei risultati, ma non funziona come mi piacerebbe. Stampa il mio messaggio come elenco (non come stringa) e genera
=ERROR REPORT==== 18-Jul-2010::01:06:27 ===
Error in process <0.89.0> with exit value: {badarg,[{erlang,register,[echo,<0.93.0>]},{echo,start,0}]}
messaggio di errore. Inoltre, quando si tenta di arrestare il server da echo:stop()
ho ottenuto un altro errore
** exception error: bad argument
in function echo:stop/0
Qualcuno mi potrebbe spiegare, che cosa sta succedendo qui? Sono nuovo di Erlang e sembra essere abbastanza difficile da capire per me in questo momento.
Le stringhe sono rappresentate come elenchi in erlang. – Jonas
Ovviamente hai ragione, ma dal momento che non ci sono caratteri, non è possibile visualizzarli, perché viene visualizzato come elenco, non come stringa? Ma questa è solo una cosa, non la più importante, il problema rimane lo stesso. – Zbigniew
@Hynek ha spiegato il problema principale. Le stringhe sono elenchi di numeri interi, quindi "" abc "' è uguale a '[97,98,99]'. Quindi erlang in realtà non "sa" se la tua lista di numeri interi è solo una lista di numeri interi o una stringa. L'uso di '~ w' in una stringa di formato lo stampa semplicemente come lista. Se usi '~ p'it testerà se gli elenchi di numeri interi potrebbero essere stringhe stampabili e se così li stampi come stringhe. Questo è ciò che fa la shell. Sì, questo era inteso, no non è un bug. Avere stringhe come elenchi li rende molto facili da usare. – rvirding