尝试在宏中为defrecord定义的类添加注释

时间:2015-01-30 01:38:24

标签: macros clojure annotations quartz-scheduler

我尝试创建一个类似于Quartzite defjob宏的宏,该宏创建了添加了@DisallowConcurrentExecution注释的Job类。代码从repl开始,但不在宏内部。

这有效......

user=> (defrecord ^{DisallowConcurrentExecution true} YYY []
  #_=>   org.quartz.Job
  #_=>   (execute [this context]
  #_=>            (println "whoosh!")))
user.YYY
user=> (seq (.getAnnotations YYY))
(#<$Proxy3 @org.quartz.DisallowConcurrentExecution()>)

......但事实并非如此。

(defmacro defncjob
  [jtype args & body]
  `(defrecord ^{DisallowConcurrentExecution true} ~jtype []
              org.quartz.Job
              (execute [this ~@args]
                ~@body)))

在罗德里戈的建议之后,这是一种让它发挥作用的方法。

(defmacro defdcejob
  [jtype args & body]
  `(defrecord ~(vary-meta jtype assoc `DisallowConcurrentExecution true) []
     org.quartz.Job
     (execute [this ~@args]
       ~@body)))

1 个答案:

答案 0 :(得分:1)

您无法在内部使用^ reader macro宏。看看this类似问题。