2015-01-30 4 views
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]))) 
+1

Вы могли бы запустить '(macroexpand-1 '(defncjob XXX [context] (println" whooosh "))) и включить результат? (это первый шаг в * каждой проблеме макроса) –

+2

Вы не можете использовать макрос читателя (^) внутри макроса. Посмотрите здесь: http://stackoverflow.com/questions/7754429/clojure-defmacro-loses-metadata –

+0

@RodrigoTaboada Пожалуйста, положите это в ответ, чтобы я мог его принять. благодаря – Bill

ответ

1

Вы не можете использовать ^reader macro внутри макросов. Посмотрите на this Аналогичный вопрос.

Смежные вопросы