2016-01-29 3 views
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) 

Похоже, что гигиена просто префикса символов содержит пространство имен модулей. Поэтому в первом случае макропроцессор не может различать разные области.

Является ли это предполагаемым поведением?

ответ

1

Кажется, что ошибка. Пожалуйста, сообщите об этом на странице github Джулии.

+0

Это также происходит в ветке разработки, поэтому я открыл новую проблему здесь: ['JuliaLang/julia # 14893'] (https://github.com/JuliaLang/julia/issues/14893) – SalchiPapa

Смежные вопросы