至于 Julia 0.4.2
macro g(y)
:((x, $y, $(esc(y))))
end
x = 1
function t()
x = 2
println(macroexpand(:(@g(x))))
println(@g(x))
end
t()
println(x)
>>>
(x,x,x)
(2,2,2)
1
我原以为结果会是(1, 1, 2)
。
但是,如果我在不同的模块中定义宏,它会按预期工作。
module A
macro g(y)
:((x, $y, $(esc(y))))
end
x = 1
end
x = 3
function t()
x = 2
println(macroexpand(:(A.@g(x))))
println(A.@g(x))
end
t()
>>>
(A.x,A.x,x)
(1,1,2)
似乎卫生只是在模块名称空间的符号前加上前缀。因此,宏扩展器不可能在第一种情况下区分不同的范围。
这是预期的行为吗?