Макрос clojure с использованием gen-класса не создает аннотации

Я пытаюсь написать макрос Clojure, который будет использоваться для генерации нескольких классов Java во время компиляции. Я обнаружил, что могу добавлять аннотации к классу, когда вызываю gen-класс вне макроса. Однако, когда я пытаюсь использовать gen-класс внутри макроса, скомпилированный класс не имеет аннотаций.

Я свел мою проблему к этому примеру:

(gen-class
  :name ^{Deprecated true} Test1
  :prefix Test1-
  :methods [[^{Deprecated true} getValue [] Integer]])

(defn Test1-getValue [] 42)

(defmacro create-test-class [name x]
  (let [prefix (str name "-")]
    `(do
      (gen-class
         :name ~(with-meta name {Deprecated true})
         :prefix ~(symbol prefix)
         :methods [[~(with-meta 'getValue {Deprecated true}) [] Integer]])
      (defn ~(symbol (str prefix "getValue")) [] ~x))))

(create-test-class Test2 56)

Когда я компилирую этот файл, он создает Test1.class и Test2.class - я проверяю оба с помощью Eclipse и обнаруживаю, что Test1 имеет аннотации @Deprecated как на уровне класса, так и на уровне метода, но Test2.class не имеет аннотаций. Когда я использую macroexpand, похоже, что мой Test2.class должен быть аннотирован:

user=> (set! *print-meta* true)
true
user=> (macroexpand '(create-test-class Test2 56))
(do (clojure.core/gen-class :name ^{java.lang.Deprecated true} Test2 :prefix Test2- :methods [[^{java.lang.Deprecated true} getValue [] java.lang.Integer]]) (user/defn Test2-getValue [] 56)) 

Что я здесь не так делаю?

1 ответ

Решение

Майкель Брандмейер ответил на вопрос здесь:

https://groups.google.com/forum/

msgstr "цитировать аннотацию в макросе. (с мета-именем`{устарело true}). Обратите внимание на обратную черту."

Вот рабочий макрос:

(defmacro create-test-class [name x]
  (let [prefix (str name "-")]
    `(do
      (gen-class
         :name ~(with-meta name `{Deprecated true})
         :prefix ~(symbol prefix)
         :methods [[~(with-meta 'getValue `{Deprecated true}) [] Integer]])
      (defn ~(symbol (str prefix "getValue")) [] ~x))))
Другие вопросы по тегам