2013-02-27 4 views
5

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?

+0

Kann ich auf das Vorhandensein der Anmerkung testen aus Clojure irgendwie? (Ich habe keine Sonnenfinsternis hier) –

Antwort

4

Meikel Brandmeyer beantwortet die Frage hier: "geben Sie die Anmerkung im Makro (mit-meta name` {Veraltete true}) Graviszeichen Hinweis.."

https://groups.google.com/forum/#!topic/clojure/Ee1bVwcUT-c

Hier ist die Arbeits Makro:

(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))))