Erlang отправка и получение сообщений - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь создать главный процесс, который вызовет 5 процессов, а затем этот процесс вызовет людей из списка. Текстовый файл выглядит следующим образом:

{Джон, [Джилл, Джо, Боб]}. {Джилл, [Боб, Джо, Боб]}. {Сью, [Jill, Jill, Jill, ЛПП, Jill]}. {Боб, [Джон]}. {Джо, [Сью]}.

Blockquote

в нем Джон - это процесс, и он отправит сообщение Джилл, Джо и Бобу. То же самое с другими процессами. До сих пор мне удавалось порождать процесс и получать элементы из подсписка, но я не знаю, как отправлять сообщения от процессов в подсписки. Я новичок в erlang, и у меня слишком много проблем, я прочитал много о процессах и параллелизме и из многих ресурсов, но это слишком много для меня. требуемый результат выглядит следующим образом:

Боб получил вступительное сообщение от Джилл [738000] Джо получил вступительное слово сообщение от Джона [741004] Боб получил вступительное сообщение от Джона [770008] Джо получил вступительное сообщение от Джилл [779007] Джон получил вступительное сообщение от Боба [736102] Джон получил ответное сообщение от Джо [741004] Джон получил ответное сообщение от Боба [770008] Джилл получил вступительное сообщение от sue [737001] боб получил вступительное сообщение от jill [816004] Боб получил ответное сообщение от Джона [736102] Боб получил вступительное сообщение от sue [897005] джилл получило вступительное сообщение от john [739000]

Отметка времени отправленного и полученного сообщения должна совпадать. любая помощь будет оценена фрагмент кода, выполняющий отправку и получение сообщения будет высоко ценится. Спасибо .

-модуль (обмен). -import (списки, [п-й / 2]). -export ([старт / 0, для / 2, for1 / 2, процесс / 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 голосов
/ 25 июня 2018

Есть несколько изменений, которые вы могли бы сделать, чтобы сделать код более понятным, и, надеюсь, это облегчит поиск проблемы. Обычно вы используете функцию element очень редко, предпочитая вместо этого сопоставление с шаблоном. Так что измени это:

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

до:

{ok, T} = file:consult("calls.txt"),

Это имеет то преимущество, что если file:consult возвращает ошибку, код быстро ее поймает, вместо того, чтобы пытаться продолжить работу, даже если у него нет данных из файла.

Ходить по списку и делать что-то для каждого элемента - обычная картина в Эрланге. Вместо того, чтобы хранить индекс и использовать 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 + 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}.

Надеюсь, это поможет - функция for1 не компилируется, когда я ее пробую, но, надеюсь, это поможет вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...