Ich versuche, ein Clojure-Makro zu schreiben, mit dem mehrere Java-Klassen zur Kompilierzeit generiert werden. Ich habe festgestellt, dass ich Anmerkungen zu einer Klasse hinzufügen kann, wenn ich gen-Klasse außerhalb eines Makros aufrufen. Wenn ich jedoch versuche, gen-class innerhalb eines Makros zu verwenden, enthält die kompilierte Klasse keine Anmerkungen.Clojure-Makro mit gen-Klasse erstellt keine Annotationen
ich gekocht mein Problem auf dieses Beispiel:
(gen-class
:name ^{Deprecated true} Test1
:prefix Test1-
:methods [[^{Deprecated true} getValue [] Integer]])
(defn Test1-getValue [] 42)
(defmacro create-test-class [name x]
(let [prefix (str name "-")]
`(do
(gen-class
:name ~(with-meta name {Deprecated true})
:prefix ~(symbol prefix)
:methods [[~(with-meta 'getValue {Deprecated true}) [] Integer]])
(defn ~(symbol (str prefix "getValue")) [] ~x))))
(create-test-class Test2 56)
Wenn ich diese Datei kompilieren, erstellt es eine Test1.class und Test2.class - ich sowohl mit Eclipse untersuchen und feststellen, dass Test1 sowohl Klasse -level- und Methodenebene @Deprecated-Annotationen, aber Test2.class, die keine Annotationen enthalten. Wenn ich macroexpand verwenden, sieht es, als ob mein Test2.class kommentiert werden soll:
user=> (set! *print-meta* true)
true
user=> (macroexpand '(create-test-class Test2 56))
(do (clojure.core/gen-class :name ^{java.lang.Deprecated true} Test2 :prefix Test2- :methods [[^{java.lang.Deprecated true} getValue [] java.lang.Integer]]) (user/defn Test2-getValue [] 56))
Was mache ich falsch hier?
Kann ich auf das Vorhandensein der Anmerkung testen aus Clojure irgendwie? (Ich habe keine Sonnenfinsternis hier) –