Hi,
proxy is a macro, where you supply the method definitions according to
its docstring in the following format:
user> (doc proxy)
...
f => (name [params*] body) or
(name ([params*] body) ([params+] body) ...)
...
so it expects: a list of name vector body*
> Unfortunately, I get an exception
>
> java.lang.RuntimeException: java.lang.UnsupportedOperationException: nth
> not supported on this type: Symbol (NO_SOURCE_FILE:2)
you wrote:
> (proxy [SHDocVw.events.DWebBrowserEvents] []
> (create-print-method-call beforeNavigate)))
so instead of a vector, proxy finds a symbol: beforenavigate
and can't call nth on that (that's what the exception said)
So you could include the whole proxy call in your macro, like:
(defmacro proxy-create-print-method-call
[name & body]
`(proxy [SHDocVw.events.DWebBrowserEvents] []
(~name [& args#]
(println (str '~name
"("
(str-join ", " (map (fn [arg#] (pr-str arg#))
args#))
")")))
~...@body))
to remove the boilerplate from your proxy code.
Or maybe you would like use sth. like this
(at least, I found this to be useful from time to time):
(defmacro fproxy
"like proxy but take a hashmap: {method-name method-fn, ...}
ex.: (.count (fproxy [clojure.lang.IPersistentVector] [] {'count (fn
[this] 99)})) -> 99."
[class-and-interfaces constructor-args method-name-fn-map]
`(let [pc# (proxy ~class-and-interfaces ~constructor-args)]
(update-proxy pc# ~method-name-fn-map)
pc#))
(def default-before-navigate-method
{"beforeNavigate" (fn [this & args]
(println (str 'beforeNavigate
"("
(str-join ", " (map #(pr-str
%) args))
")")))})
(fproxy [SHDocVw.events.DWebBrowserEvents] []
(merge default-before-navigate-method
{"anotherMethod" (fn [this ..] ...)}))
to make proxy generation more dynamic & functional.
Erik
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---