昨日エントリの Chain な実装、色々ナチュラルに忘却の彼方なナニがありました。ポイントとしては以下。
- create_process が始点
- Enum.reduce が戻すのは accumulator の最後の値
- accumulator の初期値は最初に起動されるプロセス
- spawn の戻りは起動されたプロセス
- Enum.reduce に渡される手続きオブジェクトの第二引数は accumulator
- Enum.reduce に渡される手続きオブジェクトの戻りが accumulator の値
正確には始点は run/1 という手続き。
def run(n) do
IO.puts inspect :timer.tc(Chain, :create_processes, [n])
end
ここから create_process が kickoff されて
- Enum が 1 から n まで数え上げつつ
- 最初は自身のプロセスが send_to に渡されて spawn でプロセス生成
- 生成されたプロセスが send_to に渡されて spawn でプロセス生成
- これで起動元なプロセスを保持する形でプロセスの Chain が作られる
- n 番目に生成されたプロセスが last に渡される
あとは Chain を逆に手繰りつつ n を加算していき、最後に create_process の中の receive が呼び出される、という事になります。
つうか
Enum.reduce/3
の accumulator の扱いとか忘却の彼方だったのが敗因orz