尝试向宏中定义的 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 类似的问题。
我正在尝试创建一个类似于 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 类似的问题。