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)
衛生状態は、シンボルの前にモジュールの名前空間を付けるだけのようです。したがって、最初のケースでは、マクロ エキスパンダーが異なるスコープを区別することはできません。
これは意図した動作ですか?