2014-04-19 3 views
1

내 Julia 코드가 assert 함수를 호출합니다 (또는 매크로, 확실하지 않습니다). 어설 션이 트리거 될 때 Julia v0.1.2에서 실행되면 두 번째 인수 (문자열)를 평가하고 평가 된 인스턴스를 올바르게 인쇄합니다. 아래 예제에서 v0.1.2는 "Hello world"를 인쇄합니다.줄리아의 @assert는 더 이상 주장 메시지를 평가하지 않습니까?

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 

는 사람이 새로운 동작에 도움이 되거 수 있습니까? 내장 된 어설 션을 사용하여 이전 동작을 되돌릴 수있는 방법이 있습니까? 아니면 내 자체 어설 션 기능을 구현하는 것이 더 좋을까요?

답변

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