I digged a little and I have a patch. I modified the case* parser in
Compiler.java, so the patch shouldn't affect anything else: I prefer
keeping safe since my knowledge of Clojure internals is limited, but a
more radical solution might be desirable.


The problem seems caused by the way case* gets constructed. The 7th
parameter is a hash-map that is passed directly to the compiler
(Compiler.java). The values of this hash-map are instances of the
MapEntry class.

When a case call is macroexpanded, those MapEntry instances get
printed out as vectors. When they are read back and evaluated, they
become instances of PersistentVector and the compiler barfs. Since
case* arguments are not evaluated there's no way, as far as I know, to
pass a MapEntry object to case* by calling it directly since there's
no such thing as a MapEntry literal.

My patch modifies case* so that it can handle a PersistentVector and
make a new MapEntry from it.

I'll post the patch here directly, since it's only a few lines long. I
hope it's not too rude. It's against git master branch.

--- Compiler.java.orig  2010-09-11 14:35:07.000000000 +0200
+++ Compiler.java       2010-09-13 12:12:12.033621364 +0200
@@ -7445,7 +7445,13 @@
                                {
                                Map.Entry e = (Map.Entry) o;
                                Integer minhash =
((Number)e.getKey()).intValue();
-                               MapEntry me = (MapEntry) e.getValue();
+                               MapEntry me = null;
+                               if (e.getValue() instanceof
PersistentVector) {
+                                       PersistentVector pv =
(PersistentVector) e.getValue();
+                                       me = new MapEntry(pv.nth(0),
pv.nth(1));
+                               } else {
+                                       me = (MapEntry) e.getValue();
+                               }

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