2016年11月28日月曜日

Elixirでマクロ(Macros)

Elixirマクロ(Macros)です。Elixirのマクロはdefmacro/2で定義されるとのこと。 サンプルを見ても何を意図したいのか意味がよくわからない。そのうち理解できるようになることを信じて、次に進むことにしましょう。
マクロは最後の手段としてのみ使用してください。 「明示的」は「暗黙的」よりも優れていることに注意してください。 明確なコードは簡潔なコードよりも優れています。
macros.exs
defmodule Unless do
  def fun_unless(clause, do: expression) do
    if(!clause, do: expression)
  end

  defmacro macro_unless(clause, do: expression) do
    quote do
      if(!unquote(clause), do: unquote(expression))
    end
  end
end
iex(1)> require Unless
nil
iex(2)> Unless.macro_unless true, do: IO.puts "this should never be printed"
nil
iex(3)> Unless.fun_unless true, do: IO.puts "this should never be printed"
this should never be printed
nil
マクロのUnless.macro_unlessで、"this should never be printed"の文字列が表示されないのは、関数呼び出しの引数が関数を呼び出す前に評価されるためです。 マクロは引数を評価しません。 代わりに、引数をquoteされた式として受け取り、それを他のquoteされた式に変換します。

参考サイト
Elixir: Macro入門(Qiita)
マクロと変数(Qiita)
Elixirのマクロについて浅く語ってみる(mmagさん)
Elixirのquoteとunquote

0 件のコメント:

コメントを投稿