2014-04-19 1 views
1

Mon code Julia invoque la fonction assert (ou macro, je ne suis pas sûr). Exécuté sous Julia v0.1.2 lorsque l'assertion est déclenchée, il a évalué le 2ème argument (chaîne) et a imprimé correctement l'instance évaluée. Dans l'exemple ci-dessous, v0.1.2 afficherait "Hello world".@assert de Julia n'évalue plus le message assert?

Après la mise à niveau vers la version 0.2.1, le deuxième argument n'est pas évalué. Au lieu de cela un squelette clair du message est en cours d'impression:

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 

Quelqu'un peut-il faire la lumière sur ce nouveau comportement? Existe-t-il un moyen de récupérer l'ancien comportement avec l'assertion intégrée, ou devrais-je mieux mettre en œuvre ma propre fonction d'assertion?

Répondre

2

La macro stringifie maintenant le texte d'assertion lors de la compilation, principalement en raison de considérations de performances. Vous pouvez bien sûr ajouter et utiliser votre propre macro à la place:

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