• defmacro ~でマクロを作れる

  • 基本はElixirの構文をASTに変換してから生成したい構文へと変換していく

  • ただそれだと面倒くさすぎるのでquote do ~ブロックを使ってASTを構築する

  • quote do ~ブロック内では値など全てのものがASTに変換されるため、unquote()を使って変数の値をASTに挿入する

  • Nimのマクロにあるquote do:と同じ(と言うか恐らく元ネタが同じ)

defmodule Macro do
  defmacro const(name, value) do
    quote do
      # unquote()を使うことで変数名を引数のnameにする 
      def unquote(name) do
          unquote(value)
      end
    end
  end
end
 
def Sample do
  const all_answers, 49
end

参考: Elixirで定数を定義する

Elixirにはconstが無い為、代用として定数を返す関数を宣言することがよくある。 ただ、一々変数を宣言するためだけにdef ~と書いていくのは非常に辛い。 macroを使って動的に関数を生成することで負担を減らすことができる。