@@ -213,7 +213,6 @@ def invoke(self, rdr, ch):
213213 try :
214214 eat_whitespace (rdr )
215215 except EOFError :
216- rdr .unread ()
217216 throw_syntax_error_with_data (rdr , u"Unmatched list open '('" )
218217 ch = rdr .read ()
219218
@@ -226,8 +225,9 @@ def invoke(self, rdr, ch):
226225 return acc
227226
228227 rdr .unread ()
229-
230- lst .append (read (rdr , True ))
228+ itm = read (rdr , True , always_return_form = False )
229+ if itm != rdr :
230+ lst .append (itm )
231231
232232class UnmatchedListReader (ReaderHandler ):
233233 def invoke (self , rdr , ch ):
@@ -248,7 +248,10 @@ def invoke(self, rdr, ch):
248248 return acc
249249
250250 rdr .unread ()
251- acc = rt .conj (acc , read (rdr , True ))
251+ itm = read (rdr , True , always_return_form = False )
252+ if itm != rdr :
253+ acc = rt .conj (acc , itm )
254+
252255
253256class UnmatchedVectorReader (ReaderHandler ):
254257 def invoke (self , rdr , ch ):
@@ -268,9 +271,15 @@ def invoke(self, rdr, ch):
268271 return acc
269272
270273 rdr .unread ()
271- k = read (rdr , True )
272- v = read (rdr , False )
273- acc = rt ._assoc (acc , k , v )
274+ itm = read (rdr , True , always_return_form = False )
275+ if itm != rdr :
276+ k = itm
277+ itm = rdr
278+ while itm == rdr :
279+ itm = read (rdr , False , always_return_form = False )
280+ v = itm
281+ acc = rt ._assoc (acc , k , v )
282+
274283 return acc
275284
276285class UnmatchedMapReader (ReaderHandler ):
@@ -335,7 +344,7 @@ def invoke(self, rdr, ch):
335344 acc .append (v )
336345
337346def read_token (rdr ):
338- acc = u""
347+ acc = rdr . read ()
339348 while True :
340349 ch = rdr .read ()
341350 if is_whitespace (ch ) or is_terminating_macro (ch ):
@@ -591,17 +600,13 @@ def invoke(self, rdr, ch):
591600class LineCommentReader (ReaderHandler ):
592601 def invoke (self , rdr , ch ):
593602 self .skip_line (rdr )
594- return read ( rdr , True )
603+ return rdr
595604
596605 def skip_line (self , rdr ):
597606 while True :
598607 ch = rdr .read ()
599608 if ch == u"\n " :
600609 return
601- elif ch == u"\r " :
602- ch2 = rdr .read ()
603- if ch2 == u"\n " :
604- return
605610
606611handlers = {u"(" : ListReader (),
607612 u")" : UnmatchedListReader (),
@@ -740,8 +745,7 @@ def throw_syntax_error_with_data(rdr, txt):
740745 raise object .WrappedException (err )
741746
742747
743-
744- def read (rdr , error_on_eof ):
748+ def read (rdr , error_on_eof , always_return_form = True ):
745749 try :
746750 eat_whitespace (rdr )
747751 except EOFError as ex :
@@ -758,9 +762,11 @@ def read(rdr, error_on_eof):
758762 meta = nil
759763
760764 macro = handlers .get (ch , None )
761- itm = nil
762765 if macro is not None :
763766 itm = macro .invoke (rdr , ch )
767+ if always_return_form and itm == rdr :
768+ return read (rdr , error_on_eof , always_return_form = always_return_form )
769+
764770
765771 elif is_digit (ch ):
766772 itm = read_number (rdr , ch )
@@ -778,8 +784,9 @@ def read(rdr, error_on_eof):
778784 else :
779785 itm = read_symbol (rdr , ch )
780786
781- if rt .has_meta_QMARK_ (itm ):
782- itm = rt .with_meta (itm , rt .merge (meta , rt .meta (itm )))
787+ if itm != rdr :
788+ if rt .has_meta_QMARK_ (itm ):
789+ itm = rt .with_meta (itm , rt .merge (meta , rt .meta (itm )))
783790
784791 return itm
785792
0 commit comments