知识点:
- 宏是从AST到AST的函数
- 对插入AST的常规julia对象求值, 返回其自身
- 每一个模块都有
eval
。如果你引用一个non-qualified的eval
, 它将是当前模块的eval
, 例如在REPL里,eval
就是Main.eval
。 - 当前模块可以用
@__MODULE__
访问。 __module__
和__source__
只能在宏定义的主体内被访问。(它们其实分别是宏的第2和第1个参数,用户书写的第n个参数其实最后会是第n+2个参数)。- 一个宏调用返回一个AST,它将会被插入到其(指这个宏)被调用的地方。 如果这个宏返回的AST没有被
esc
给包住,那么将会被处理为卫生宏,从而无法访问宏调用处的作用域。(当前模块的全局作用域可以被访问)
function() __module__
end # wrong
macro f()
mod = __module__
:(1 + $(mod.a))
end
a = 1
@f
# => 2
macro g1()
:(1 + x)
end
function f(x)
@g1
end
f(2) # `x` is not defined!
macro g2()
:(1 + x) |> esc
end
function f(x)
@g2
end
f(2) # => 3