Невозможно создать простой сервер в Erlang - PullRequest
4 голосов
/ 28 июня 2010

У меня есть простой сервер:

-module(simple_server).
-export([loop/0]).

loop() ->
    receive 
    {fact, N, Sender} ->
        Sender ! {factResult, fact(N), self()},
        loop();
    {fib, N, Sender} ->
        Sender ! {fibResult, fib(N), self()},
        loop();
    {stop, Sender} ->
        Sender ! ok
    end.

fact(0) -> 1;
fact(N) -> N * fact(N - 1).

fib(N) -> fib(N, 1, 0).

fib(0, _B, A) -> A;
fib(N, B, A) -> fib(N-1, A+B, B).

Тогда я получаю это:

...\code>erl simple_server.erl

Eshell V5.7.5  (abort with ^G)
1> Server = spawn('server@myserver', fun simple_server:loop/0).

=ERROR REPORT==== 28-Jun-2010::10:46:29 ===
** Can not start erlang:apply,[#Fun<simple_server.loop.0>,[]] on server@myserver**
<0.33.0>

Что я пропустил?

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Не похоже, что вы начали как распределенный узел.Я получаю такое же сообщение об ошибке, когда мой узел оболочки erlang запускается без короткого имени / длинного имени, используя флаг "-sname" / "-name" erl .

Если вы запустите эту оболочку, чтобы она могла участвовать в распространении, вы также должны убедиться, что код для simple_server загружен на удаленном узле, или что удаленный узел может автоматически загрузить его из своего пути кода.

Для интерактивного использования вы можете использовать команды nc(File) или nl(Module) в оболочке для загрузки всех известных узлов.Используйте net_adm:ping(Node), чтобы пропинговать узел, если он еще не указан, когда вы делаете erlang:nodes().

1 голос
/ 28 июня 2010

Вы должны сначала прочитать документацию. Некоторый учебник будет полезен.

  1. erl с исходным кодом модуля ничего не делает. Прочитайте erl -man erl для получения дополнительной информации.
  2. erlang:apply\2 имеет Node в качестве первого аргумента, но Node должен существовать и должен быть подключен к текущему узлу.

Вы должны попробовать:

$ erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
1> c(simple_server).
{ok, simple_serevr}
2> spawn(simple_server, loop, []).
<0.33.0>
3>

В качестве хорошей отправной точки вы можете взглянуть на Learn You Some Erlang For Great Good .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...