【发布时间】:2011-03-08 21:06:23
【问题描述】:
我最近开始认真学习 Programming Erlang 这本书,我有一个问题。 以下是 Erlang 的正确方法吗?这是(为简洁而修改(无退出消息),在基本验证后删除日志记录)解决来自 ch4 的环问题。进程在传递消息预期次数后退出;第一个进程等待最后一条消息到达并退出。
除了对风格和实质的一般批评之外,你能告诉我这样写特殊的 1-2 行函数是否是正确的风格,或者是否应该使用 if-s、cases-s 等?
start_ring( 0, _, _ ) -> {error, badarg};
start_ring( _, 0, _ ) -> {error, badarg};
start_ring( M, N, Message ) ->
spawn( ring, run_ring, [M, N, Message, 0] ).
% last process that connects the ring
run_ring( M, 1, Message, Pid ) when is_pid(Pid) ->
loop_ring( M, Message, Pid, false );
% process in the middle
run_ring( M, N, Message, Pid ) when is_pid(Pid) ->
loop_ring( M, Message, spawn( ring, run_ring, [M, N-1, Message, Pid] ), false );
% first process - special case for one process
run_ring( M, 1, Message, _ ) ->
loop_ring( M, self() ! Message, self(), true );
% first process
run_ring( M, N, Message, _ ) ->
NextPid = spawn( ring, run_ring, [M, N-1, Message, self()] ),
loop_ring( M, NextPid ! Message, NextPid, true ).
loop_ring( 0, _, _, _ ) -> ok;
loop_ring( 1, Message, Next, true ) -> ok;
loop_ring( M, Message, Next, IsMaster ) ->
receive
Message -> loop_ring( M - 1, Next ! Message, Next, IsMaster )
end.
【问题讨论】:
标签: erlang