Я начал серьезно изучать книгу по программированию на языке Эрланг, и у меня есть вопрос.
Подходящий подход к Erlang ниже? Это (изменено для краткости (без сообщения о выходе) с удалением регистрации после базовой проверки) решение проблемы с кольцом из ch4. Процессы завершаются после того, как они передали сообщение предполагаемое количество раз; Первый процесс ожидает, пока последнее сообщение достигнет его, и завершает работу.
Помимо общей критики стиля и содержания, подскажите, пожалуйста, правильно ли писать специальные 1-2-строчные функции, подобные этой, или следует использовать if-s, case-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.