/var/log/messages

May 15, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (29)

昨日エントリの 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

プログラミング Elixir (28) 週末料理

comments powered by Disqus