速習プログラミングElixir勉強会 #4
http://connpass.com/event/43633/
の発表資料。
自己紹介
名前: 正徳 巧
会社: 株式会社grooves
言語: Ruby
github: sinsoku
twitter: @sinsoku_listy
読了した感想
良かった
- 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