2010-06-10 5 views
10

Ich versuche, eine Reflektionswarnung in Clojure aufzulösen, die aus dem Fehlen von Typrückschluss auf Funktionsrückgabewerte zu resultieren scheint, die normale Java-Objekte sind.Geben Sie Hinweise für Funktionen in Clojure ein

Trivial Beispiel-Code, der das Problem demonstriert:

(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 

Was ist der beste Weg, dies zu lösen? Kann dies mit Typhinweisen geschehen?

+0

Welche Version von Clojure verwenden Sie? Ich habe dein Beispiel in meinem Clojure v1.0 versucht und es scheint gut zu funktionieren ... – Greg

+0

Es ist ein Clojure 1.2 Build. Beachten Sie, dass die Warnung nur angezeigt wird mit (set! * Warn-on-reflection * true) was der Unterschied sein kann .... die Frage bearbeitet, um klarer zu werden – mikera

+0

Ja, das war es. Ich sehe es jetzt. – Greg

Antwort

11

Diese beiden Versionen erscheinen arbeiten:

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 

Beachten Sie, dass Typ-Hinting im Fluss noch ein wenig in Clojure ist jetzt auf die Version 1.2 führt, so könnte dies nicht immer auf die gleiche Weise arbeiten. Beachten Sie auch, dass #^ für ^ veraltet ist.

+0

Großartig, funktioniert perfekt danke! Auch gut zu wissen über die sich ändernde Syntax ... die Freuden, auf dem neuesten Stand zu leben, denke ich :-) – mikera

+0

das ist großartig! Ich freue mich darauf, meinen Code mit diesem :) zu beschleunigen – jorgeu

Verwandte Themen