2010-07-17 17 views
6

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.

+0

Le stringhe sono rappresentate come elenchi in erlang. – Jonas

+0

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

+0

@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

risposta

9

Quando la funzione loop/0 ricevere print messaggio si chiama start/0 nuovo che genera nuovo processo e cercando di registrarlo come echo nuovo. Fa sì che il tuo server muoia e quello nuovo non è registrato come echo, quindi non puoi più inviarti messaggi tramite la funzione print/1.

loop() -> 
    receive 
     {print, Msg} -> 
      io:format("You sent a message: ~w.~n", [Msg]), 
      loop(); % <-- just here! 
     stop -> 
      io:format("Server is off.~n"); 
     _ -> 
      io:format("Unidentified command.~n"), 
      loop() 
    end. 
+0

Certo, era così semplice. Grazie mille, sembra che fossi stanco e non ho notato errori evidenti. Grazie ancora. – Zbigniew