我正在尝试编写clojure宏,该宏将用于在编译时生成多个Java类。我发现当我在宏之外调用gen-class时,可以在类中添加注释。但是,当我尝试在宏中使用gen-class时,编译后的类没有注释。
我将问题归结为以下示例:
(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。当我使用macroexpand时,似乎应该对我的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))
我在这里做错了什么?
最佳答案
Meikel Brandmeyer在这里回答了问题:
https://groups.google.com/forum/#!topic/clojure/Ee1bVwcUT-c
“在宏中引用注释。(具有元名称`{Deprecated true}。请注意反引号。”
这是工作宏:
(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))))