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

Reply via email to