宏的卫生(hygienic)是指, 我们在宏里赋值的变量, 不会对宏之外的变量造成影响.

例如:

defmodule Hygiene do
  defmacro no_interference do
    quote do
      a = 1
    end
  end
end

require Hygiene

a = 10
Hygiene.no_interference
a #=> 10

虽然我们在宏之内将 a 赋值为 1, 但 a 的值仍然为 10.

如果我们想打破宏的卫生性, 使用宏来更改变量的值, 那么我们就需要使用 var!宏:

defmodule NoHygiene do
  defmacro interference do
    quote do
      var!(a) = 1
    end
  end
end

require NoHygiene

a = 10
Nohygiene.interference
a #=> 1

Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能