2013-02-27 18 views
5

Derleme zamanında birden çok Java sınıfı oluşturmak için kullanılacak bir clojure makrosu yazmaya çalışıyorum. Makro dışında gen sınıfı çağırdığımda bir sınıfa ek notlar ekleyebileceğimi öğrendim. Ancak, bir makro içinde gen sınıfı kullanmaya çalıştığımda, derlenmiş sınıfın ek açıklamaları yoktur. - Ben Eclipse ile hem teftiş ve Test1 hem sınıf sahip olduğunu bulmak ben bu dosyayı derlemek zamangen sınıfı kullanılarak clojure makro ek açıklamaları oluşturmuyor

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

, bir Test1.class ve Test2.class oluşturur:

ben bu örneğe aşağı sorunumu haşlanmış -vevel ve yöntem düzeyinde @Geliştirilmiş ek açıklamalar, ancak ek açıklamaları olmayan Test2.class. Ben macroexpand kullandığınızda, benim Test2.class açıklamalı edilmelidir sanki görünür:

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

yanlış burada ne yapıyorum?

+0

: Burada

çalışma makrodur? (Burada tutulma yok) –

cevap

4

Meikel Brandmeyer burada soruyu yanıtladı: "makroda ek açıklama alıntı (with-meta adı` {gerçek kullanımdan kaldırıldı}) backtick unutmayın.."

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

Bir şekilde Clojure içinden açıklama varlığı için test edebilir

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