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 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 -~----------~----~----~----~------~----~------~--~---