4

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)

衛生状態は、シンボルの前にモジュールの名前空間を付けるだけのようです。したがって、最初のケースでは、マクロ エキスパンダーが異なるスコープを区別することはできません。

これは意図した動作ですか?

4

1 に答える 1

1

バグのようです。Julia の github ページで報告してください。

于 2016-01-30T07:00:07.677 に答える