Are macros lazily evaluated?

A macro is replaced with the AST that it returns. So, this:

MyMacros.my_if 1 + 2 == 3, do: IO.puts("this"), else: IO.puts("that")

Turns into this at compile time:

case 1 + 2 == 3 do
  true -> IO.puts("this")
  false -> IO.puts("that")
end

Like @tmbb said, case is lazy. Not the macro.

The function appears non-lazy, because the arguments have to be evaluated before they are passed to MyFunctions.my_if/2.