erlang邮件发送和接收回复

时间:2018-06-23 20:30:45

标签: erlang

我试图在此处创建一个主流程,该流程将生成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).

1 个答案:

答案 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}. 函数在我尝试使用时不会编译,但是希望它可以帮助您入门。