Hello.
This is with Clojure 1.2.
This works:
(gen-class
:name "com.nsn.isar.saxon.ext_funcs.ClojureReceiver"
:extends net.sf.saxon.event.ProxyReceiver
:exposes {nextReceiver { :get getReceiver :set setReceiver } }
:exposes-methods { startDocument "superStartDocument",
endDocument "superEndDocument",
startElement "superStartElement",
endElement "superEndElement",
attribute "superAttribute",
startContent
"superStartContent",
getNamePool "superGetNamePool" } )
If I however write a function to compute the map for exposes-methods,
nothing seems to work.
I also don't understand why the method names have to be given as
symbols here and not as strings.
{ "endDocument" "superEndDocument" } would not work. It's probably
because of this in gen-class:
(if (contains? exposes-methods (symbol name))
However, not even this would work:
:exposes-methods { (symbol "startDocument") "superStartDocument" }
I wrote this to compute me a map of name mappings for
the :exposesMethods (the definition of classMethods is of the web,
though):
(defn classMethods
"Discovers all the public methods of a class or object by
introspection and returns their names in order."
[x]
(let [c (if (class? x) x (class x))]
(distinct (sort (seq
(map #(.getName %1)
(.getMethods c)))))))
(defn makeCamelCase
"Upper-cases the first letter of a String."
[x]
(str (.toUpperCase (.substring x 0 1)) (.substring x 1)))
(defn createSuperName [x] (str "super" (makeCamelCase x)))
(defn exposeMethods
"Will compute a :exposes-methods spec for gen-class. Provide it with
a class or object and it will discover
all public methods names and prefix them with 'super'."
[x]
(loop [resultMap {}
methodNames (classMethods x)]
(if (empty? methodNames)
resultMap
(let [firstMethod (first methodNames)
restMethods (rest methodNames)]
(recur (assoc resultMap (symbol firstMethod)
(createSuperName firstMethod))
restMethods)))))
In the REPL it works correctly and gives me a map of the style that
exposes-methods should accept. But if I make a call (exposeMethods
net.sf.saxon.event.ProxyReceiver) within the gen-class macro, it does
not work.
My questions are:
1) Is this a problem of evaluation? Does my call not to exposeMethods
not get evaluated at compile time? (My assumption would have been that
in a Lisp dialect it would get expanded even at compile-time.)
2) Why does only the format { <symbol> <string> } work for the map?
What is the
I tried to read the definition of the gen-class macro, but it is
beyond me on my first week of Clojure. ;-)
Thank you in advance,
Oliver
--
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