宏观卫生只能在不同模块中保护您吗?

时间:2016-01-29 22:13:02

标签: macros julia hygiene

至于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)

似乎卫生只是在符号前加上模块名称空间。因此宏扩展器不可能在第一种情况下区分不同的范围。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

好像是一个错误。请在Julia的github页面上报告。