Julia的@assert不再评估断言消息?

时间:2014-04-19 08:41:20

标签: assert julia

我的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

任何人都可以对这种新行为有所了解吗? 有没有办法用内置断言来恢复旧的行为,或者我会更好地实现自己的断言函数?

1 个答案:

答案 0 :(得分:2)

宏现在在编译时对断言文本进行字符串化,主要是出于性能考虑。您当然可以添加和使用自己的宏:

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