Macros 宏卫生是否仅在不同模块中保护您?

Macros 宏卫生是否仅在不同模块中保护您?,macros,julia,hygiene,Macros,Julia,Hygiene,至于朱莉娅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)

至于朱莉娅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)
似乎用户只是在符号前面加上模块名称空间。因此,在第一种情况下,宏扩展器不可能区分不同的作用域


这是预期的行为吗?

似乎是一个bug。请在Julia的github页面报告

这也发生在开发部门,因此我在这里打开了一个新的问题: