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();
