Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 使用gen类的clojure宏不';不要创建注释_Macros_Clojure_Annotations_Gen Class - Fatal编程技术网

Macros 使用gen类的clojure宏不';不要创建注释

Macros 使用gen类的clojure宏不';不要创建注释,macros,clojure,annotations,gen-class,Macros,Clojure,Annotations,Gen Class,我试图编写一个clojure宏,用于在编译时生成多个Java类。我发现,当我在宏外部调用gen类时,我可以向类添加注释。但是,当我尝试在宏中使用gen类时,编译后的类没有注释 我把我的问题归结为这个例子: (gen-class :name ^{Deprecated true} Test1 :prefix Test1- :methods [[^{Deprecated true} getValue [] Integer]]) (defn Test1-getValue [] 42) (

我试图编写一个clojure宏,用于在编译时生成多个Java类。我发现,当我在宏外部调用gen类时,我可以向类添加注释。但是,当我尝试在宏中使用gen类时,编译后的类没有注释

我把我的问题归结为这个例子:

(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在这里回答了这个问题:

引用宏中的注释。(元名称为`{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))))

我可以从Clojure内部测试注释的存在吗?(我这里没有日食)