我试图在此处创建一个主流程,该流程将生成5个流程,然后这些流程将呼叫列表中的人员。文本文件如下:
{john,[jill,joe,bob]}。 {jill,[bob,joe,bob]}。 {起诉, [jill,jill,jill,bob,jill]}。 {bob,[john]}。 {joe,[起诉]}。
Blockquote
其中的john是一个进程,它将向Jill,joe和bob发送消息。与其他过程相同。到目前为止,我能够生成流程并从子列表中获取元素,但是我不知道如何将流程中的消息发送到子列表。我是erlang的初学者,但是我面临着太多的问题,我已经阅读了有关流程和并发性,以及来自许多资源的很多信息,但这对我来说太多了。所需的输出如下所示:
bob收到了jill的介绍性消息[738000] joe收到了介绍性信息 来自约翰的消息[741004] bob收到了约翰的介绍性消息 [770008]乔收到吉尔的介绍性消息[779007]约翰收到了 bob的简介消息[736102] john收到joe的回复消息 [741004]约翰收到了鲍勃的回复消息[770008]吉尔收到了 起诉状的介绍性消息[737001]鲍勃收到吉尔的介绍性消息 [816004]鲍勃收到了约翰的回音[736102]鲍勃收到了 起诉状的介绍性消息[897005]吉尔收到了约翰的介绍性消息 [739000]
已发送和已接收消息的时间戳记应匹配。 任何帮助将不胜感激,代码片段执行消息发送和接收将不胜感激。谢谢 。
-模块(交换)。 -import(列表,[nth / 2])。 -export([start / 0,for / 2,for1 / 2,process / 0])。
start()->
A=file:consult("calls.txt"),
T=element(2,A),
L=length(T),
%io:fwrite("~w",[L]),
for(L,T).
for(0,_)->
[];
for(L,Term) when L > 0 ->
S=nth(L,Term),
S1=element(1,S),
io:fwrite(" ~w~n",[S1]),
Q=element(2,S),
R=length(Q),
B=nth(1,Q),
for1 (R,Q),
Pid=spawn(exchange,process,[]),
register(S1,Pid),
S1 ! {sender, S1,R,Q},
for(L-1,Term).
for1(0,_)->
[];
for1(L1,Term1) when L1 >0 ->
S2=nth(L1,Term1),
process()->
receive
{sender, S1,R,Q}->
io:fwrite("~w received intro message from ",[S1]),
process()
end;
for1 (L1-1,Term1).
答案 0 :(得分:2)
您可以进行一些更改以使代码更清晰,希望这将使查找问题更容易。通常,您很少使用函数element
,而更喜欢使用模式匹配。所以改变这个:
A=file:consult("calls.txt"),
T=element(2,A),
收件人:
{ok, T} = file:consult("calls.txt"),
这样做的好处是,如果file:consult
返回错误,则代码将迅速捕获该错误,即使它没有文件中的数据,也不会尝试继续操作。
遍历列表并为每个元素做某事是Erlang中的常见模式。您通常会调用lists:nth
而不是保留索引并使用lists:foreach
,它是一个更高级别的函数,它在每个列表元素上调用您的函数。所以代替:
L=length(T),
%io:fwrite("~w",[L]),
for(L,T).
您可以写:
lists:foreach(fun for/1, T).
然后,您的for
函数(由于不再执行循环,因此可能会得到另一个名称)将从
for(S) ->
S1=element(1,S),
io:fwrite(" ~w~n",[S1]),
%% ...
在这里,您可以在函数头中进行模式匹配,以避免调用element
:
for({S1, Q}) ->
io:fwrite(" ~w~n",[S1]),
R=length(Q),
B=nth(1,Q),
for1 (R,Q),
Pid=spawn(exchange,process,[]),
register(S1,Pid),
S1 ! {sender, S1,R,Q}.
这一次我们再次使用length
的{{1}} + nth
模式,因此我们也可以用for1
替换它:
lists:foreach
希望如此-for({S1, Q}) ->
io:fwrite(" ~w~n",[S1]),
lists:foreach(fun for1/1, Q),
Pid=spawn(exchange,process,[]),
register(S1,Pid),
S1 ! {sender, S1,R,Q}.
函数在我尝试使用时不会编译,但是希望它可以帮助您入门。