2017-07-30 2 views
2

Quelqu'un peut-il résoudre cette erreur macro que je vais avoir, il n'a commencé à se produire dans la version 0.6:Julia v0.6 macro dans la fonction

mutable struct Foo 
    x::Int 
end 

macro test(myfoo) 
    quoteblock = 
    quote 
    myfoo.x += 1 
    end 

    return quoteblock 
end 

function func(myfoo) 
    @test myfoo 
    println(myfoo.x) 
end 

foo = Foo(3) 
func(foo) 

En théorie, cela devrait simplement remplacer la ligne @test myfoo dans la fonction func avec myfoo.x += 1 au moment de la compilation, qui devrait fonctionner, mais j'obtiens l'erreur:

UndefVarError: myfoo not defined 

Répondre

3

le changement-notes correspondantes sont listés here:

When a macro is called in the module in which that macro is defined, global variables in the macro are now correctly resolved in the macro definition environment. Breakage from this change commonly manifests as undefined variable errors that do not occur under 0.5. Fixing such breakage typically requires sprinkling additional escs in the offending macro (#15850).

donc la réponse est d'échapper myfoo:

macro test(myfoo) 
    quote 
    $(esc(myfoo)).x += 1 
    end 
end 
+0

Cela résout mon exemple, mais apparemment mon exemple n'a pas capturé un peu subtilement dans mon code actuel. Quand j'inclus $ (esc()), j'obtiens maintenant l'erreur non définie immédiatement en essayant de charger mon code source. – Thoth

+0

@Thoth Pouvez-vous poster l'intégralité du code? – Gnimuc

+0

nm, j'ai trouvé un moyen d'adapter votre solution, merci. – Thoth