Elixir宏:上下文、卫生性及应用实践
1. 上下文与宏卫生性
宏在注入代码时,需要特别关注调用者上下文和宏自身上下文。宏注入的代码不能默认某些变量可用。例如,以下宏定义尝试访问调用者上下文的变量:
defmodule ContextInfo do
defmacro grab_caller_context do
quote do
IO.puts x
end
end
end
在 iex 中加载该模块并调用宏,会得到编译错误:
iex(1)> c "context.exs"
[ContextInfo]
iex(2)> import ContextInfo
nil
iex(3)> x = 42
42
iex(4)> grab_caller_context
** (CompileError) iex:4: undefined function x/0
expanding macro: ContextInfo.grab_caller_context/0
iex:4: (file)
同样,宏不能安全地注入改变调用者上下文或环境的代码。例如,向 ContextInfo 模块添加一个尝试改变 x 值的宏:
defmacro inject_context_
超级会员免费看
订阅专栏 解锁全文
5

被折叠的 条评论
为什么被折叠?



