有人可以解决我遇到的这个宏错误,它只在版本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
答案 0 :(得分:3)
列出相应的更改注释here:
在定义该宏的模块中调用宏时, 宏中的全局变量现在可以在宏中正确解析 定义环境。 这种变化的破坏通常表现出来 作为未定义的变量错误,在0.5以下不会发生。修复这样的 破损通常需要喷洒额外的escs 违规宏(#15850)。
所以答案是逃避myfoo
:
macro test(myfoo)
quote
$(esc(myfoo)).x += 1
end
end