2013-02-27 56 views
5

我正在尝试编写一个clojure宏,用于在编译时生成多个Java类。我发现,当我在宏外调用gen-class时,我可以向类中添加注释。但是,当我尝试在宏内使用gen-class时,编译的类没有注释。使用gen-class的clojure宏不会创建注释

我煮了我的问题到这个例子:

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

当我编译这个文件,它会创建一个Test1.class和Test2.class - 我检查都与Eclipse,并找到Test1的既有类级和方法级@Deprecated注释,但Test2.class没有注释。当我使用宏观展开时,看起来好像我的Test2.class应该注释:

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

我在做什么错在这里?

+0

我可以在Clojure的测试注释的存在从某种程度上? (我没有在这里发生日食) – 2013-02-27 22:24:32

回答

4

Meikel Brandmeyer回答此问题: “引用注释宏(用-META NAME`{弃用真})注意反引号。”

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

这里是工作的宏:

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