2010-06-10 3 views
10

J'essaie de résoudre un avertissement de réflexion dans Clojure qui semble résulter de l'absence d'inférence de type sur les valeurs de retour de fonction qui sont des objets Java normaux.Type indiquant des fonctions dans Clojure

exemple de code Trivial qui démontre la question:

(set! *warn-on-reflection* true)  

(defn foo [#^Integer x] (+ 3 x)) 

(.equals (foo 2) (foo 2)) 

=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved. 
    true 

Quelle est la meilleure façon de résoudre ce problème? Cela peut-il être fait avec des conseils de type?

+0

Quelle version de Clojure utilisez-vous? J'ai essayé votre exemple dans ma Clojure v1.0 et ça semble fonctionner ... – Greg

+0

C'est une version clojure 1.2. Notez que l'avertissement ne montre qu'avec (set! * Warn-on-reflection * true) qui peut être la différence .... éditer la question pour clarifier – mikera

+0

Oui, c'était ça. Je le vois maintenant. – Greg

Répondre

11

Ces deux versions semblent fonctionner:

user> (defn foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved. ;' 
true 
user> (.equals ^Integer (foo 2) ^Integer (foo 2)) 
true 
user> (defn ^Integer foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
true 

Notez que le type hinting est encore un peu en pleine mutation dans Clojure en ce moment menant à la version 1.2, donc cela pourrait ne pas fonctionner de la même façon pour toujours. Notez également que #^ est déprécié au profit de ^.

+0

Super, fonctionne parfaitement grâce! Aussi bon à savoir sur la syntaxe changeante ... les joies de vivre sur le tranchant je suppose :-) – mikera

+0

c'est génial! hâte d'accélérer mon code en utilisant cela :) – jorgeu

Questions connexes