尝试向宏中定义的 defrecord 添加注释 class

Attempt to add annotation to defrecord defined class in macro

我正在尝试创建一个类似于 Quartzite defjob 宏的宏,该宏创建作业 class 添加了 @DisallowConcurrentExecution 注释。该代码在 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)))

根据 Rodrigo 的建议,这里有一个方法可以让它发挥作用。

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

您不能使用 ^ reader macro inside macros. Take a look at this 类似的问题。