3
Что касается Юлии 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(:([email protected](x))))
println([email protected](x))
end
t()
>>>
(A.x,A.x,x)
(1,1,2)
Похоже, что гигиена просто префикса символов содержит пространство имен модулей. Поэтому в первом случае макропроцессор не может различать разные области.
Является ли это предполагаемым поведением?
Это также происходит в ветке разработки, поэтому я открыл новую проблему здесь: ['JuliaLang/julia # 14893'] (https://github.com/JuliaLang/julia/issues/14893) – SalchiPapa