2013-02-27 19 views
5

Próbuję napisać makro clojure, które będzie używane do generowania wielu klas Java w czasie kompilacji. Odkryłem, że mogę dodawać adnotacje do klasy, gdy wywołuję klasę genów poza makrem. Jednak gdy próbuję użyć klasy gen w makrze, klasa skompilowana nie ma adnotacji.Makro clojure przy użyciu klasy gen nie tworzy adnotacji

I gotowane mój problem w dół do tego przykładu:

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

Kiedy skompilować ten plik, tworzy Test1.class i Test2.class - I sprawdzać zarówno z Eclipse, a okaże się, że ma zarówno klasy Test1 -deklarowane adnotacje na poziomie i poziomie @, ale w wersji Test2.class bez adnotacji. Gdy używam macroexpand, wygląda to tak, jakby moja Test2.class powinny być opatrzone:

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

Co robię źle tutaj?

+0

mogę przetestować na obecność adnotacją od wewnątrz Clojure jakoś? (Nie mam tutaj zaćmienia) –

Odpowiedz

4

Meikel Brandmeyer odpowiedział na pytanie tutaj: "cytowania adnotacji w makro (z-meta name` {Przestarzałe true}) Uwaga ze znaku odwróconego apostrofu.".

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

Oto makro pracy:

(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)))) 
Powiązane problemy