Clojure宏使用gen-class无法创建注释。

5
我正在尝试编写一个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没有注解。当我使用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)) 

我在这里做错了什么?

我能在Clojure中以某种方式测试注解的存在吗?(我这里没有eclipse) - Arthur Ulfeldt
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接