Hi Folks,
I'm attempting to write a clojure macro that uses gen-class to replace
several manually written Java classes that all follow a similar pattern.
Yes, in my magic world of unicorns and mermaids, I would just rewrite them
in pure clojure, but for the context of this question my solution has to
generate Java classes (I can elaborate if anybody really wants to know).
The problem is that my macro is apparently unable to emit gen-class code
that will include annotations in the class. I've boiled my problem down to
this example:
(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)
When I compile this file, it creates a Test1.class and Test2.class - I
inspect both with Eclipse, and find that Test1 has both class-level and
method-level @Deprecated annotations, but Test2.class has no annotations.
When I use macroexpand, it looks as though my Test2.class should be
annotated:
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))
Is there something wrong with the way that I attempt to attach the metadata?
Thanks!
Michael Willis
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.