2010-02-15 6 views

Répondre

12

L'explication est à http://clojure.org/java_interop.

user> (macroexpand '(.PI Math)) 
(. (clojure.core/identity Math) PI) 

(identity Math) retourne l'objet Class représentant la classe Math. Vous essayez d'accéder à un membre d'instance appelé PI dans cet objet Class, mais il n'existe pas. (Ceci est différent de l'accès à un membre statique appelé PI dans la classe Math.) Vous utiliseriez seulement cet objet Class pour la réflexion, ou pour passer une classe autour d'autres méthodes comme un objet, ou ce genre de choses.

user> (class (identity Math)) 
java.lang.Class 
user> (.getName (identity Math)) 
"java.lang.Math" 
user> (.getName Math) 
"java.lang.Math" 
user> (.getMethods Math) 
#<Method[] [Ljava.lang.reflect.Method;@12344e8> 
user> (vec (.getMethods Math)) 
[#<Method public static int java.lang.Math.abs(int)> #<Method public static long java.lang.Math.abs(long)> #<Method public static float java.lang.Math.abs(float)> ...] 
user> (.getField Math "PI") 
#<Field public static final double java.lang.Math.PI> 
user> (.getDouble (.getField Math "PI") Math) 
3.141592653589793 

Le moyen le plus court de faire ce que vous voulez est probablement Math/PI.

user> (macroexpand '(Math/PI)) 
(. Math PI) 
user> Math/PI 
3.141592653589793 
user> (. Math PI) 
3.141592653589793