Выбор синтаксиса - это вопрос вкуса или правил кодирования компании, но интересна сила этой функции. вот пример, когда я отправляю функцию в сообщении на другой узел, который, в свою очередь, пересылает список процессов, которые в конечном итоге выполняют его (обратите внимание, что я выбрал анонимную функцию, делая это, я уверен, что принимающий узел сможет для выполнения функции):
старта 2 узлов:
erl -sname node1
erl -sname node2
на node1, в оболочке (нуждается в R17, чтобы работать с этим синтаксисом):
Loop = fun Loop(X) -> receive
{forward, Mess} -> lists:foreach(fun(Pid) -> Pid ! Mess end, X), Loop(X);
stop -> ok
end
end.
Proc = fun Proc(X) -> receive
{do,Fun} -> Y = Fun(X), Proc(Y);
stop -> ok
end
end.
L = [spawn(fun() -> Proc(0) end) || _ <- lists:seq(1,10)].
register(server,spawn(fun() -> Loop(L) end)).
на node2:
([email protected])1>net_adm:ping([email protected]).
pong
([email protected])2> {server,[email protected]} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
([email protected])3> {server,[email protected]} ! {forward,{do,fun(X) -> X + 1 end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
([email protected])4> {server,[email protected]} ! {forward,{do,fun(X) ->Self = self(), io:format("~p state is ~p~n",[Self,X]),X end}}.
{forward,{do,#Fun<erl_eval.6.90072148>}}
([email protected])4>
результат на node1:
<0.42.0> state is 0
<0.43.0> state is 0
<0.44.0> state is 0
<0.45.0> state is 0
<0.46.0> state is 0
<0.47.0> state is 0
<0.48.0> state is 0
<0.49.0> state is 0
<0.50.0> state is 0
<0.51.0> state is 0
<0.43.0> state is 1
<0.42.0> state is 1
<0.44.0> state is 1
<0.45.0> state is 1
<0.46.0> state is 1
<0.47.0> state is 1
<0.48.0> state is 1
<0.49.0> state is 1
<0.50.0> state is 1
<0.51.0> state is 1
([email protected])5>
Пожалуйста, приведите пример. – bereal
@bereal: ok..2 minutes –