Erlang простая проблема с сервером - PullRequest
6 голосов
/ 18 июля 2010

Когда я изучаю Erlang, я пытаюсь решить ex.4.1 («Echo server») из книги «Erlang Programming» (автор O'Reilly), и у меня проблема.Мой код выглядит так:

-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.

К сожалению, у меня есть некоторые проблемы.Включение работает должным образом, запускает новый процесс и отображает сообщение «Сервер готов».Но когда я пытаюсь использовать функцию печати (например, echo:print("Some message.").), я получаю результат, но он не работает так, как хотелось бы.Он печатает мое сообщение в виде списка (не в виде строки) и генерирует сообщение об ошибке

=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}]}

.Более того, когда я пытаюсь остановить сервер на echo:stop(), я получаю еще одну ошибку

** exception error: bad argument
 in function  echo:stop/0

Может кто-нибудь объяснить мне, что здесь происходит?Я новичок в Erlang, и мне кажется, что мне сейчас трудно это понять.

1 Ответ

9 голосов
/ 18 июля 2010

Когда ваша функция loop/0 получает сообщение print, вы снова вызываете start/0, что порождает новый процесс и пытается снова зарегистрировать его как echo.Это приводит к тому, что ваш сервер умирает, а новый не регистрируется как echo, поэтому вы больше не можете отправлять ему сообщения с помощью функции 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...