erlang消息发送和接收回复

erlang消息发送和接收回复,erlang,Erlang,我试图在这里创建一个主进程,它将生成5个进程,然后这些进程将调用列表中的人。文本文件如下: {约翰、[吉尔、乔、鲍勃]}。{吉尔,[鲍勃,乔,鲍勃]}。{苏, 吉尔,吉尔,吉尔,鲍勃,吉尔。{鲍勃,[约翰]}。{乔,[苏]} 大宗报价 其中john是一个进程,将向Jill、joe和bob发送消息。与其他过程相同。到目前为止,我能够生成进程并从子列表中获取元素,但我不知道如何将消息从进程发送到子列表。我是erlang的初学者,在erlang中遇到了太多的问题。我已经阅读了很多关于进程和并发性的内容

我试图在这里创建一个主进程,它将生成5个进程,然后这些进程将调用列表中的人。文本文件如下:

{约翰、[吉尔、乔、鲍勃]}。{吉尔,[鲍勃,乔,鲍勃]}。{苏, 吉尔,吉尔,吉尔,鲍勃,吉尔。{鲍勃,[约翰]}。{乔,[苏]}

大宗报价

其中john是一个进程,将向Jill、joe和bob发送消息。与其他过程相同。到目前为止,我能够生成进程并从子列表中获取元素,但我不知道如何将消息从进程发送到子列表。我是erlang的初学者,在erlang中遇到了太多的问题。我已经阅读了很多关于进程和并发性的内容,并从许多资源中获得了很多信息,但这对我来说太多了。所需的输出看起来像这样:

鲍勃收到吉尔的介绍信[738000]乔收到介绍信 来自约翰的消息[741004]鲍勃收到了来自约翰的介绍消息 [770008]乔收到吉尔的介绍信[779007]约翰收到 来自鲍勃的介绍信息[736102]约翰收到了来自乔的回复信息 [741004]john收到bob的回复信息[770008]jill收到 sue的介绍信息[737001]bob收到jill的介绍信息 [816004]鲍勃收到约翰的回复信息[736102]鲍勃收到 苏发来的介绍信[897005]吉尔收到约翰发来的介绍信 [739000]

发送和接收的消息的时间戳应匹配。 任何帮助都将不胜感激。执行消息发送和接收的代码片段将不胜感激。多谢各位

-模块(交换)。 -导入(列表,[n/2])。 -导出([start/0,for/2,for 1/2,process/0])


为了使代码更清晰,您可以做一些更改,希望这样可以更容易地发现问题。通常很少使用函数
元素
,而是更喜欢模式匹配。因此,改变这一点:

A=file:consult("calls.txt"),
T=element(2,A),
致:

这样做的好处是,如果
file:consult
返回错误,代码将很快捕捉到错误,而不是在没有文件数据的情况下尝试继续

遍历列表并为每个元素执行操作是Erlang中的常见模式。您通常会调用
lists:foreach
,而不是保留索引并使用
lists:nth
,这是一个对每个列表元素调用您的函数的高级函数。因此,不是:

   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]),
   %% ...
在这里,您可以在函数头中进行模式匹配,以避免调用
元素

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
+
nth
模式,这次是针对
for1
,所以我们也可以用
列表代替它: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}.

希望这有帮助-我尝试时,
for1
函数没有编译,但希望这能帮助您开始。

您可以做一些更改,使代码更清晰,希望这能使您更容易发现问题。通常很少使用函数
元素
,而是更喜欢模式匹配。因此,改变这一点:

A=file:consult("calls.txt"),
T=element(2,A),
致:

这样做的好处是,如果
file:consult
返回错误,代码将很快捕捉到错误,而不是在没有文件数据的情况下尝试继续

遍历列表并为每个元素执行操作是Erlang中的常见模式。您通常会调用
lists:foreach
,而不是保留索引并使用
lists:nth
,这是一个对每个列表元素调用您的函数的高级函数。因此,不是:

   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]),
   %% ...
在这里,您可以在函数头中进行模式匹配,以避免调用
元素

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
+
nth
模式,这次是针对
for1
,所以我们也可以用
列表代替它: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}.
希望这有帮助-当我尝试时,
for1
函数没有编译,但希望这能帮助您开始