Skip to content
Elixir

매크로로 메타프로그래밍

컴파일 타임에 코드를 작성하는 코드 작성.

#macro#metaprogramming#ast

Code

elixir
# Macro: generates code at compile time
defmodule MyMacros do
  defmacro unless(condition, do: block) do
    quote do
      if not unquote(condition), do: unquote(block)
    end
  end

  defmacro my_if(cond, do: yes, else: no) do
    quote do
      case unquote(cond) do
        true -> unquote(yes)
        false -> unquote(no)
      end
    end
  end
end

# Usage
import MyMacros
unless false do
  IO.puts("This prints")
end

# Inspecting AST
ast = quote do: 1 + 2 * 3
IO.inspect(ast)
# {:+, [context: ...], [1, {:*, [...], [2, 3]}]}

# Macro that defines a function
defmodule Loggable do
  defmacro deflogged(name, do: body) do
    quote do
      def unquote(name) do
        IO.puts("Calling #{unquote(name)}")
        result = unquote(body)
        IO.puts("Result: #{inspect(result)}")
        result
      end
    end
  end
end

defmodule Example do
  import Loggable
  deflogged greet do
    "Hello!"
  end
end