延迟代码生成
当宏执行时, 区分宏上下文和调用者的上下文是很重要的:
defmacro my_macro do
# Macro context(宏上下文): 这里的代码是宏的正常部分, 并在宏运行时被执行...Caller's context: 我们应该在这里转换输入的 AST, 然后在这里做出我们的假设
end
end
为什么我们可以在调用者的上下文(Caller’s context)中进行假设?...end
由于调用者上下文(Caller’s context)是模块级的, 因此这种延迟转换仍将在编译时发生, 不会有运行时性能损失.
解决方案
鉴于这些讨论, 解决方案相对简单, 但解释它相当复杂....bar # <- 由于 bind_quoted 而可访问
end
代码注入 vs 数据传输
我们要面临的另一个问题是: 从宏传递到调用者上下文的内容在默认情况下是注入的, 而不是传输的....在这种情况下, 我们真正想要的是数据传输. 在代码生成上下文中, 我们有一些数据要传输到调用者的上下文中. 这就是Macro.escape 作用所处.