我是Erlang的新手。在我的代码中,我尝试给每个2进程一个数字列表。过程oid
应将其列表中的所有偶数发送到过程eid
,该过程应将其过程中的所有奇数发送到oid
。当一个进程完成对自己的列表的过滤后,它开始读取从另一个进程收到的消息,将它们添加到输出列表中,最后打印该列表。erlang进程通讯(代码错误)
当我运行的代码我得到这些错误:
=错误报告==== 28-APR-2015 :: 23:01:25 ===
错误的过程< 0.296。 0>退出值:{if_clause,[{test,odd,2,[{file,“test.erl”},{line,25}]}]}= ERROR REPORT ==== 28- Apr-2015 :: 23:01:25 ===
错误处理< 0.297.0>退出值:{if_clause,[{test,even,2,[{file,“test.erl”},{ line,49}]}]}
这里是我的代码:
-module(test).
-export([start/0]).
-export([odd/2]).
-export([even/2]).
start() ->
register(oid, spawn(test, odd, [[1,2,3,4,5],[]])),
register(eid, spawn(test, even, [[6,7,8,9],[]])).
%---------------------------------------------
odd(c,O) ->
receive
done ->
lists:foreach(
fun(X) -> io:fwrite("~p\n", X) end,
io:fwrite("~p\n", oid)
);
Num ->
O++[Num],
odd(c,O)
end;
odd([],O) ->
eid ! done,
odd(c,O);
odd([A|Rest],O) ->
if
A rem 2 =:= 0 ->
eid ! A;
A rem 2 =/= 0 ->
O++[A],
odd([Rest],O)
end.
%--------------------------------------------
even(c,E)->
receive
done ->
lists:foreach(
fun(X) -> io:fwrite("~p\n", X) end,
io:fwrite("~p\n", eid)
);
Num ->
E++[Num],
even(c,E)
end;
even([],E) ->
oid ! done,
even(c,E);
even([A|Rest],E) ->
if
A rem 2 =/= 0 ->
oid ! A;
A rem 2 =:= 0 ->
E++[A],
even([Rest],E)
end.
%---------------------------------------------
pri([H|T]) ->
io:format("~p~n", [H]),
pri(T);
pri([]) ->
true.
伟大的职位。是否有任何意见扭转列表只是为了排序呢? –
即使排序本身解决了这个问题,但我留下了相反的情况,并将其排序为两个不连续的步骤,因为我想让反转非常明显。这是因为这篇文章解释了在使用'[Head | Tail]构建列表时,如何最终得到一个与您真正想要的顺序相反的列表,并最终颠倒它是常见的。我在那里反过来提醒读者。 –
这完全是超级。 我还有一个问题,我怎样才能让这些流程做好工作并在他们到达时接收消息。我已经看到了一些loop()实现,但是它们都表明这个过程正在等待。有没有办法实现通知? 非常感谢 – ErlangNewbie