LoginSignup
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-15
1 / 13

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

の発表資料。


自己紹介

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


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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2