マクロはテキスト置換ではない
マクロは呼び出し元とスコープを共有しない
マクロは自分自身のスコープとquoteしたマクロのボディのスコープを持つ
goh@goh% iex "macros/hygiene.ex"
Erlang/OTP 21 [erts-10.1.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
In macro definition, local = some value
End of macro body, local = cat
On returen, local = 123
- コンパイル
quoteブロックは評価されない
=> "In macro definition.." が表示される - 埋め込み
quoteブロックの内部表現が評価される
=> "End of macro body.." が表示される - Testモジュールの最後の行が評価される
=> "On return.." が表示される