Hi Clojure Gurus :)
I've a somewhat contrived use-case for macros that I've been
struggling with.
Let's say there's an interface called EWrapper that I'm trying to
implement with methods "tickPrice" and "tickSize", a concrete class
EWrapperMsgGenerator that has methods with those names that return
strings.
I'd like to write a macro that proxies EWrapper's tickSize and
tickPrice methods so that they print out the method name as well as
the string returned from EWrapperMsgGenerator.
E.g. (in java code):
public tickSize( args ) { // on the proxied EWrapper
System.out.println( "tickSize: " +
EWrapperMsgGenerator.tickSize( args ) )
}
Here's what I've come up with so far:
(defmacro make-msg-ewrapper [method-names]
`(proxy [EWrapper] []
~@(map
(fn [method-name]
`(~(symbol method-name) [& args#]
(println ~method-name ":"
(. EWrapperMsgGenerator ~(symbol method-name)
args#))))
method-names)))
It's a bit messy -- I'm splicing in a map evaluation into proxy, and
then writing in symbols in the function body. This works except that
when I run the macro I get "No matching method: tickSize" referring to
EWrapperMsgGenerator.
The macro expansion looks like:
(let* [p__4736__auto__ (new user.proxy$java.lang.Object$EWrapper
$11bc5609)] (clojure.core/init-proxy p__4736__auto__ {tickPrice
(clojure.core/fn ([this & args__2058__auto__] (clojure.core/println
tickPrice : (. com.ib.client.EWrapperMsgGenerator tickPrice
args__2058__auto__)))), list (clojure.core/fn ([this &
args__2058__auto__] (clojure.core/println list : (.
com.ib.client.EWrapperMsgGenerator list args__2058__auto__))))})
p__4736__auto__)
So far this looks fine to me, except that tickPrice within the
EWrapperMsgGenerator call isn't scoped. Is there a better way to do
this?
Thanks,
Jian
--
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