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.






















