Julia v0.6宏内功能

时间:2017-07-30 14:29:35

标签: julia

有人可以解决我遇到的这个宏错误,它只在版本0.6中开始发生:

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)

理论上,这应该只是在编译时用@test myfoo替换函数func中的行myfoo.x += 1,这应该有效,但我得到错误:

UndefVarError: myfoo not defined

1 个答案:

答案 0 :(得分:3)

列出相应的更改注释here

  

在定义该宏的模块中调用宏时,   宏中的全局变量现在可以在宏中正确解析   定义环境。 这种变化的破坏通常表现出来   作为未定义的变量错误,在0.5以下不会发生。修复这样的   破损通常需要喷洒额外的escs   违规宏(#15850)。

所以答案是逃避myfoo

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