宏的卫生(hygienic)是指, 我们在宏里赋值的变量, 不会对宏之外的变量造成影响.
例如:
defmodule Hygiene do defmacro no_interference do quote do a = 1 end endendrequire Hygienea = 10Hygiene.no_interferencea #=> 10
虽然我们在宏之内将 a 赋值为 1, 但 a 的值仍然为 10.
如果我们想打破宏的卫生性, 使用宏来更改变量的值, 那么我们就需要使用 var!
宏:
defmodule NoHygiene do defmacro interference do quote do var!(a) = 1 end endendrequire NoHygienea = 10Nohygiene.interferencea #=> 1