Search⌘ K
AI Features

Macros Are Hygienic

Explore how hygienic macros in Elixir maintain distinct scopes that prevent variable conflicts during code expansion. Learn to use macros safely without overwriting variables in modules and functions.

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:

Elixir
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
...