diff --git src/jvm/clojure/lang/LispReader.java src/jvm/clojure/lang/LispReader.java index 0f0864a..02bc6d4 100644 --- src/jvm/clojure/lang/LispReader.java +++ src/jvm/clojure/lang/LispReader.java @@ -894,7 +894,8 @@ public static class ListReader extends AFn{ int line = -1; if(r instanceof LineNumberingPushbackReader) line = ((LineNumberingPushbackReader) r).getLineNumber(); - List list = readDelimitedList(')', r, true); + //List list = readDelimitedList(')', r, true); + List list = readDelimitedListPossiblyDelimitedEarly(')',']', r, true); if(list.isEmpty()) return PersistentList.EMPTY; IObj s = (IObj) PersistentList.create(list); @@ -1064,6 +1065,58 @@ public static List readDelimitedList(char delim, PushbackReader r, boolean isRec return a; } + + +public static List readDelimitedListPossiblyDelimitedEarly(char delim,char earlyDelim, PushbackReader r, boolean isRecursive) throws Exception{ + ArrayList a = new ArrayList(); + + for(; ;) + { + int ch = r.read(); + + while(isWhitespace(ch)) + ch = r.read(); + + if(ch == -1) + throw new Exception("EOF while reading"); + + if(ch == delim) + break; + + if(ch == earlyDelim) + { + Object o = read(r, true, null, isRecursive); + if (o != r) + a.add(o); + + break; + } + + IFn macroFn = getMacro(ch); + if(macroFn != null) + { + Object mret = macroFn.invoke(r, (char) ch); + //no op macros return the reader + if(mret != r) + a.add(mret); + } + else + { + unread(r, ch); + + Object o = read(r, true, null, isRecursive); + if(o != r) + a.add(o); + } + } + + + return a; +} + + + + /* public static void main(String[] args) throws Exception{ //RT.init();