Я новичок в Erlang и пытаюсь понять, как отправить сообщение от одного процесса к списку процессов.
Предположительно у нас есть структура данных, содержащая список с идентификаторами. Как я могу заставить Pid отправлять сообщение «M» в список Pid, где каждый элемент списка имеет 2 элемента: строку (представляющую имя) и Pid? Я придумал:
broadcast(P, M, R) ->
P ! {self(), friends},
receive
{P, Friends} ->
P ! {self(), {send_message, {M, R, P, Friends}}}
end.
looper({Name, Friends, Messages}) ->
{From, {send_message, {M, R, ID, [{FriendPid, FriendName} | FriendTale]}}} ->
if R =< 0 ->
From ! {From, {self(), {ID, M}}},
looper({Name, [{FriendPid, FriendName} | FriendTale], [{ID, M} | Messages]});
R > 0 andalso FriendTale =/= []->
FriendPid ! {From, {send_message, {M, R-1, ID, FriendTale}}},
looper({Name, FriendTale, [{ID, M} | Messages]})
end;
terminate ->
ok
end.
Но насколько я понимаю, я не могу правильно сопоставить шаблон со списком Pid, чтобы я мог «извлечь» Pid из элемента списка Pid.
По сути, у меня есть функция под названием «looper», которая постоянно ожидает поступления новых сообщений. Когда он получает сообщение типа
{send_message, {M, R, ID, [{FriendPid, FriendName} | FriendTale]}}
где «M» - это сообщение, которое я хочу передать списку Pid-идентификаторов под названием «Друзья», а R - просто целое число.
R - это целое число, указывающее, как далеко должно идти сообщение.
e.g. 0 = broadcast the message to self,
1 = broadcast the message to the friends of the pid,
2 = broadcast the message to the friends of the friends of the pid and so on...
Что я получаю от терминала после того, как установлю Pid и установлю "дружбу" между Pid:
1> f().
ok
2> c(facein).
facein.erl:72: Warning: variable 'From' is unused
{ok,facein}
3> {Message, Pid} = facein:start({"Bjarki", [], []}).
{ok,<0.186.0>}
4> {Message, Pid2} = facein:start({"Bjarki2", [], []}).
{ok,<0.188.0>}
5> facein:add_friend(Pid,Pid2).
ok
6> facein:broadcast(Pid,"hello",1).
=ERROR REPORT==== 5-Oct-2014::12:12:58 ===
Error in process <0.186.0> with exit value: {if_clause,[{facein,looper,1,[{file,"facein.erl"},{line,74}]}]}
{<0.177.0>,{send_message,{"hello",1,#Ref<0.0.0.914>}}}
Любая помощь будет принята с благодарностью. Спасибо
loop
определение (точнее, как названы ваши аргументы). - person mpm   schedule 04.10.2014