【发布时间】:2011-03-17 11:04:45
【问题描述】:
在学习 Erlang 时,我正在尝试解决 ex。来自“Erlang Programming”一书(O'Reilly)的 4.1(“An Echo 服务器”),我有一个问题。 我的代码如下所示:
-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 新手,目前似乎很难掌握。
【问题讨论】:
-
字符串在 erlang 中表示为列表。
-
当然你是对的,但是由于没有字符,无法显示,为什么它显示为列表,而不是字符串?但这只是一件事,不是最重要的,问题依旧。
-
@Hynek 已经解释了主要问题。字符串是整数列表,因此
"abc"与[97,98,99]相同。因此,erlang 并不真正“知道”您的整数列表是否只是整数列表或字符串。在格式字符串中使用~w只会将其打印为列表。如果您使用~p它将测试整数列表是否可以是可打印的字符串,如果可以,将它们打印为字符串。这就是外壳的作用。是的,这是故意的,不,这不是错误。将字符串作为列表使它们非常易于使用。 -
确实,使用 ~p 参数,打印就像预期的那样工作。感谢您的提示。
标签: erlang