J'essaie d'envelopper une bibliothèque Java avec une liaison de clojure. Une classe particulière de la bibliothèque Java définit un groupe de constantes finales statiques, par exemple:
(def foo-bar Foo/BAR) (def foo-some-constant Foo/SOME_CONSTANT)
3 Réponses :
(cette réponse comprend maintenant deux solutions de travail, une fois sur mon idée initiale avec extraire des champs statiques: p> Mise à jour 2: strong> P> P> OK, en fait, une approche basée sur stagiaire code> n'est pas si mauvaise lisibilité-wise: p> update: strong> ( Laissant la première mise à jour en place sous forme de solution alternative) em> p> Combinant la connaissance de Danlei de stagiaire code> et une base sur la suggestion de Danlei à utiliser CCImpport-static code>. Je suppose que je devrai nettoyer cela un peu plus tard, mais je ne peux pas passer plus de temps dessus maintenant ...) em> puis map # (stagiaire * ns * (str "a-préfixe-" (.getname%)) (.tClass nil)) code> sur cette séquence pour obtenir la valeur ... Notez que Ce bit n'est pas testé fort> et, en particulier, je ne suis pas sûr de ce nil code> dans .get code>; Expérimentez avec java.lang.field code> et voyez ce qui fonctionne avec votre classe. Strike> p> Clojure.Contribe Code> avec les rendements ci-dessus: P> user> (map #(eval `(import-static java.lang.Integer ~(symbol (.getName %))))
(filter #(bit-and java.lang.reflect.Modifier/STATIC
(.getModifiers %))
(.getFields java.lang.Integer)))
(#'user/MIN_VALUE #'user/MAX_VALUE #'user/TYPE #'user/SIZE)
user> MIN_VALUE
-2147483648
user> MAX_VALUE
2147483647
user> TYPE
int
user> SIZE
32
Je n'ai pas essayé, mais peut-être clojure.contrib.import-statique peut le faire. p>
Il suffit de vérifier: vous devrez nommer les méthodes / champs lorsque vous utilisez importé-statique, mais je laisserai cette réponse ici car il peut être utile pour les personnes à la recherche de réponses connexes. P>
C.C.IMPORT-STATIC CODE>, D'OH ... En réalité, il est parfaitement possible de le profiter ici avec l'aide de eval code>. J'ai pris la liberté de l'utiliser dans une modification à ma réponse qui donne une approche alternative de stagiaire code> + scandery de réflexion Java.
Malheureusement, la macro clojure.contrib.import-static em> ne permet pas d'importer Cette macro est une enveloppe idiomatique pour importateur-statique em>: p>
Y a-t-il peut-être une solution de clojure plus concise qui utilise clojure.reflect / reflect code>? clojuredocs.org/clojure_core/clojure.reflect/reflect