我有一个简单的服务器:
-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>
我错过了什么?
答案 0 :(得分:3)
它看起来不像是作为分布式节点启动的。当使用erl的“-sname”/“ - name”标志启动我的shell erlang节点而没有短名称/长名称时,我收到相同的错误消息。
如果您启动此shell以便它可以参与分发,您还必须确保在远程节点上加载simple_server的代码,或者远程节点可以从其代码路径自动加载它。
对于交互式使用,您可以使用shell中的nc(File)
或nl(Module)
命令加载所有已知节点。如果您执行net_adm:ping(Node)
时尚未列出节点,请使用erlang:nodes()
ping该节点。
答案 1 :(得分:1)
您应该先阅读文档。一些教程会有所帮助。
erl -man erl
了解详情。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。