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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to