Macros Are Hygienic

Learn more about macros and their scope in Elixir.

We'll cover the following...

Introduction

It’s tempting to think of macros as some kind of textual substitution. A macro’s body is expanded as text and then compiled at the point of call. But that’s not the case. Consider this example:

Press + to interact
defmodule Scope do
defmacro update_local(val) do
local = "some value"
result = quote do
local = unquote(val)
IO.puts "End of macro body, local = #{local}"
end
IO.puts "In macro definition, local = #{local}"
result
end
end
defmodule Test do
require Scope
local = 123
Scope.update_local("cat")
IO.puts "On return, local = #{local}"
end

Here’s the result of running that code:

In macro definition,
...