Hi,
I'm trying to look at events thrown by COM automation objects using
com4j and clojure and am trying to use macros to clean up my code.
Here is a small script that works without macros:
(use 'clojure.contrib.str-utils)
(def ie (SHDocVw.ClassFactory/createInternetExplorer))
(.visible ie true)
(def ie-logger
(proxy [SHDocVw.events.DWebBrowserEvents] []
(beforeNavigate
[& args]
(println (str 'beforeNavigate
"("
(str-join ", " (map #(pr-str %) args))
")")))))
(def cookie (.advise ie SHDocVw.events.DWebBrowserEvents ie-logger))
(read-line)
(.close cookie)
I tried to create a macro to automatically create the beforeNavigate method.
(defmacro create-print-method-call
"For use in `proxy`, create a method that prints it's arguments when it
is invoked"
[name]
`(~name [& args#]
(println (str '~name
"("
(str-join ", " (map (fn [arg#] (pr-str arg#)) args#))
")"))))
I wanted to use this macro like
(def ie-logger
(proxy [SHDocVw.events.DWebBrowserEvents] []
(create-print-method-call beforeNavigate)))
Unfortunately, I get an exception
java.lang.RuntimeException: java.lang.UnsupportedOperationException: nth
not supported on this type: Symbol (NO_SOURCE_FILE:2)
(Full exception stace trace at the end of the email.)
If I (macroexpand-1 '(create-print-method-call beforeNavigate)), I get
(beforeNavigate [& args__2585__auto__] (clojure.core/println
(clojure.core/str (quote beforeNavigate) "("
(clojure.contrib.str-utils/str-join ", " (clojure.core/map (clojure.core/fn
[arg__2586__auto__] (clojure.core/pr-str arg__2586__auto__))
args__2585__auto__)) ")")))
which I can cut and paste to be the beforeNavigate method in the proxy macro.
I'm guessing the problem is that the create-print-method-call macro is
not getting expanded before the proxy macro. I really have no idea
though. I would really appreciate any pointers on how to get this to work.
Thanks,
Jeff
Full stack trace
java.lang.RuntimeException: java.lang.UnsupportedOperationException: nth not
supported on this type: Symbol (NO_SOURCE_FILE:2)
[Thrown class clojure.lang.Compiler$CompilerException]
Restarts:
0: [ABORT] Return to SLIME's top level.
1: [CAUSE] Throw cause of this exception
Backtrace:
0: clojure.lang.Compiler.analyzeSeq(Compiler.java:4558)
1: clojure.lang.Compiler.analyze(Compiler.java:4373)
2: clojure.lang.Compiler.analyze(Compiler.java:4334)
3: clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:4125)
4: clojure.lang.Compiler.analyzeSeq(Compiler.java:4551)
5: clojure.lang.Compiler.analyze(Compiler.java:4373)
6: clojure.lang.Compiler.analyzeSeq(Compiler.java:4539)
7: clojure.lang.Compiler.analyze(Compiler.java:4373)
8: clojure.lang.Compiler.analyzeSeq(Compiler.java:4539)
9: clojure.lang.Compiler.analyze(Compiler.java:4373)
10: clojure.lang.Compiler.access$100(Compiler.java:35)
11: clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:372)
12: clojure.lang.Compiler.analyzeSeq(Compiler.java:4551)
13: clojure.lang.Compiler.analyze(Compiler.java:4373)
14: clojure.lang.Compiler.analyze(Compiler.java:4334)
15: clojure.lang.Compiler.eval(Compiler.java:4595)
16: clojure.core$eval__4604.invoke(core.clj:1728)
17: swank.commands.basic$eval_region__957.invoke(basic.clj:36)
18: swank.commands.basic$eval__966$interactive_eval__968.invoke(basic.clj:45)
19: clojure.lang.Var.invoke(Var.java:346)
20: user$eval__3200.invoke(NO_SOURCE_FILE)
21: clojure.lang.Compiler.eval(Compiler.java:4592)
22: clojure.core$eval__4604.invoke(core.clj:1728)
23: swank.core$eval_in_emacs_package__456.invoke(core.clj:55)
24: swank.core$eval_for_emacs__533.invoke(core.clj:123)
25: clojure.lang.Var.invoke(Var.java:354)
26: clojure.lang.AFn.applyToHelper(AFn.java:179)
27: clojure.lang.Var.applyTo(Var.java:463)
28: clojure.core$apply__3857.doInvoke(core.clj:390)
29: clojure.lang.RestFn.invoke(RestFn.java:428)
30: swank.core$eval_from_control__459.invoke(core.clj:62)
31: swank.core$spawn_worker_thread__556$fn__587$fn__589.invoke(core.clj:162)
32: clojure.lang.AFn.applyToHelper(AFn.java:171)
33: clojure.lang.AFn.applyTo(AFn.java:164)
34: clojure.core$apply__3857.doInvoke(core.clj:390)
35: clojure.lang.RestFn.invoke(RestFn.java:428)
36: swank.core$spawn_worker_thread__556$fn__587.doInvoke(core.clj:158)
37: clojure.lang.RestFn.invoke(RestFn.java:402)
38: clojure.lang.AFn.run(AFn.java:37)
39: java.lang.Thread.run(Unknown Source)
java.lang.UnsupportedOperationException: nth not supported on this type: Symbol
[Thrown class java.lang.RuntimeException]
Restarts:
0: [ABORT] Return to SLIME's top level.
1: [CAUSE] Throw cause of this exception
Backtrace:
0: clojure.lang.LazySeq.seq(LazySeq.java:46)
1: clojure.lang.Cons.next(Cons.java:37)
2: clojure.lang.ASeq.hashCode(ASeq.java:66)
3: clojure.lang.APersistentMap.hashCode(APersistentMap.java:102)
4: clojure.lang.ASeq.hashCode(ASeq.java:68)
5: clojure.lang.ASeq.hashCode(ASeq.java:68)
6: clojure.lang.ASeq.hashCode(ASeq.java:68)
7: clojure.lang.Util.hash(Util.java:55)
8: clojure.lang.PersistentHashMap.entryAt(PersistentHashMap.java:134)
9: clojure.lang.PersistentHashMap.containsKey(PersistentHashMap.java:130)
10: clojure.lang.Compiler.isSpecial(Compiler.java:244)
11: clojure.lang.Compiler.macroexpand1(Compiler.java:4454)
12: clojure.lang.Compiler.analyzeSeq(Compiler.java:4537)
13: clojure.lang.Compiler.analyze(Compiler.java:4373)
14: clojure.lang.Compiler.analyze(Compiler.java:4334)
15: clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:4125)
16: clojure.lang.Compiler.analyzeSeq(Compiler.java:4551)
17: clojure.lang.Compiler.analyze(Compiler.java:4373)
18: clojure.lang.Compiler.analyzeSeq(Compiler.java:4539)
19: clojure.lang.Compiler.analyze(Compiler.java:4373)
20: clojure.lang.Compiler.analyzeSeq(Compiler.java:4539)
21: clojure.lang.Compiler.analyze(Compiler.java:4373)
22: clojure.lang.Compiler.access$100(Compiler.java:35)
23: clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:372)
24: clojure.lang.Compiler.analyzeSeq(Compiler.java:4551)
25: clojure.lang.Compiler.analyze(Compiler.java:4373)
26: clojure.lang.Compiler.analyze(Compiler.java:4334)
27: clojure.lang.Compiler.eval(Compiler.java:4595)
28: clojure.core$eval__4604.invoke(core.clj:1728)
29: swank.commands.basic$eval_region__957.invoke(basic.clj:36)
30: swank.commands.basic$eval__966$interactive_eval__968.invoke(basic.clj:45)
31: clojure.lang.Var.invoke(Var.java:346)
32: user$eval__3200.invoke(NO_SOURCE_FILE)
33: clojure.lang.Compiler.eval(Compiler.java:4592)
34: clojure.core$eval__4604.invoke(core.clj:1728)
35: swank.core$eval_in_emacs_package__456.invoke(core.clj:55)
36: swank.core$eval_for_emacs__533.invoke(core.clj:123)
37: clojure.lang.Var.invoke(Var.java:354)
38: clojure.lang.AFn.applyToHelper(AFn.java:179)
39: clojure.lang.Var.applyTo(Var.java:463)
40: clojure.core$apply__3857.doInvoke(core.clj:390)
41: clojure.lang.RestFn.invoke(RestFn.java:428)
42: swank.core$eval_from_control__459.invoke(core.clj:62)
43: swank.core$spawn_worker_thread__556$fn__587$fn__589.invoke(core.clj:162)
44: clojure.lang.AFn.applyToHelper(AFn.java:171)
45: clojure.lang.AFn.applyTo(AFn.java:164)
46: clojure.core$apply__3857.doInvoke(core.clj:390)
47: clojure.lang.RestFn.invoke(RestFn.java:428)
48: swank.core$spawn_worker_thread__556$fn__587.doInvoke(core.clj:158)
49: clojure.lang.RestFn.invoke(RestFn.java:402)
50: clojure.lang.AFn.run(AFn.java:37)
51: java.lang.Thread.run(Unknown Source)
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---