使用gen-class的clojure宏不会创建注释

Mic*_*lis 5 macros annotations clojure gen-class

我正在尝试编写一个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)
Run Code Online (Sandbox Code Playgroud)

当我编译这个文件时,它创建了一个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)) 
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Mic*_*lis 4

Meikel Brandmeyer 在这里回答了这个问题:

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

“在宏中引用注释。(with-meta name `{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))))
Run Code Online (Sandbox Code Playgroud)