我是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