3
Я пытаюсь создать макрос, похожий на макрос defjob Quartzite, который создает класс Job с добавлением к нему аннотации @DisallowConcurrentExecution. Код работает из repl, но не внутри макроса.Попытка добавить аннотацию к defrecord определенному классу в макрос
Это работает ...
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 [email protected]]
[email protected])))
После предложения Родриго, вот способ заставить его работать.
(defmacro defdcejob
[jtype args & body]
`(defrecord ~(vary-meta jtype assoc `DisallowConcurrentExecution true) []
org.quartz.Job
(execute [this [email protected]]
[email protected])))
Вы могли бы запустить '(macroexpand-1 '(defncjob XXX [context] (println" whooosh "))) и включить результат? (это первый шаг в * каждой проблеме макроса) –
Вы не можете использовать макрос читателя (^) внутри макроса. Посмотрите здесь: http://stackoverflow.com/questions/7754429/clojure-defmacro-loses-metadata –
@RodrigoTaboada Пожалуйста, положите это в ответ, чтобы я мог его принять. благодаря – Bill