2010-06-10 10 views
10

Estoy intentando resolver una advertencia de reflexión en Clojure que parece ser el resultado de la falta de inferencia de tipo en los valores de devolución de función que son objetos normales de Java.Escriba sugerencia para funciones en Clojure

código de ejemplo trivial que demuestra el problema:

(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 

¿Cuál es la mejor manera de resolver esto? ¿Se puede hacer esto con sugerencias tipo?

+0

¿Qué versión de Clojure estás usando? Probé tu ejemplo en mi Clojure v1.0 y parece funcionar bien ... – Greg

+0

Es una construcción de clojure 1.2. Tenga en cuenta que la advertencia solo se muestra con (set! * Warn-on-reflection * true) que puede ser la diferencia ... editó la pregunta para aclarar – mikera

+0

Sí, eso fue todo. Ya lo veo. – Greg

Respuesta

11

Estas dos versiones parecen funcionar:

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 

Tenga en cuenta que tipo de insinuación es todavía un poco de flujo en Clojure en este momento anterior a la versión 1.2, por lo que este puede que no funcionen de la misma manera para siempre. Tenga en cuenta también que #^ está en desuso en favor de ^.

+0

Genial, funciona perfectamente gracias! También es bueno saber sobre la sintaxis cambiante ... las alegrías de vivir a la vanguardia supongo que :-) – mikera

+0

¡eso es genial! esperando acelerar mi código usando esto :) – jorgeu

Cuestiones relacionadas