Elixir のマクロとプロセスの関係

  • 2
    いいね
  • 0
    コメント

速習プログラミングElixir勉強会 #4
http://connpass.com/event/43633/

の発表資料。


自己紹介

名前: 正徳 巧
会社: 株式会社grooves
言語: Ruby
github: sinsoku
twitter: @sinsoku_listy


https://jobs.forkwell.com/

jobs.png


読了した感想


良かった

  • 3週で無事に読了できた
  • 言い回しが面白い
    • 「邪悪な双子 unless」
  • Ruby と違う考え方を学べた
    • クラスがない、再起、パターンマッチ
  • 並行プロセスの実行が容易
  • 13章のissuesが実践的

よく分からない

  • OTP, Agent 周りの理解が浅い
  • 業務で具体的に使うイメージが沸かない
    • まだ理解が浅い
  • 並行実行を考慮した設計

マクロとプロセスの関係


前回の勉強会で出た話題

「メソッドを動的に定義した場合、それは他プロセスに影響するのか?」という話題が出たので、試してみた。


メソッドの動的定義

defmodule LazyDef do
  def define do
    defmodule Greet do
      def say do
        IO.puts "hello"
      end
    end
  end
end

try do
  LazyDef.Greet.say
rescue
  UndefinedFunctionError -> IO.puts "UndefinedFunctionError"
end
#=> UndefinedFunctionError

LazyDef.define
LazyDef.Greet.say
#=> hello

プロセス実行後に動的定義

defmodule Main do
  def run(n) do
    :timer.sleep n * 100
    LazyDef.Greet.say
  end
end

spawn(Main, :run, [0])
#=> UndefinedFunctionError

spawn(Main, :run, [1])
LazyDef.define
#=> hello

receive do
  {:ok, result} -> IO.puts result
  after 500 -> IO.puts "TimeOut"
end

たまに落ちるコード

defmodule Def do
  defmacro m(name) do
    quote bind_quoted: [name: name] do
      def unquote(:"m_#{name}")(), do: unquote(name)
    end
  end
end

defmodule A do
  def run do
    defmodule B do
      require Def
      Enum.shuffle(1..5)
      |> Enum.take(2)
      |> Enum.each(&Def.m(&1))
    end
  end
end

A.run
IO.inspect A.B.m_1

ご清聴ありがとうございます