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