我的Julia代码调用断言函数(或者宏,我不确定)。当断言被触发时,它在Julia v0.1.2下运行,计算第二个参数(字符串)并正确打印计算的实例。在下面的示例中,v0.1.2将打印"Hello world"。
升级到v0.2.1后,第二个参数不会得到评估。相反,一个不清楚的信息框架正在打印:
julia> a="world" ; @assert(1==0,"hello $a")
ERROR: assertion failed: :($(Expr(:string, "hello ", :a)))
in error at error.jl:21
julia> a="world" ; assert(1==0,"hello $a")
ERROR: assertion failed: y
in assert at deprecated.jl:21
有人能解释一下这种新行为吗?有没有一种方法可以用内置的断言恢复旧的行为,或者我会更好地实现自己的断言函数?
宏现在在编译时字符串化断言文本,主要是出于性能考虑。您当然可以添加并使用自己的宏:
julia> macro assert2(ex, text)
:($ex ? nothing : error("Assertion failed: ", $(text)))
end
julia> @assert2(1==2, "hello $a")
ERROR: Assertion failed: hello abc
in error at error.jl:22