Skip to content

Commit 004fa83

Browse files
Not delete all of @justinj's comment reading fixes
1 parent 49ea5be commit 004fa83

2 files changed

Lines changed: 28 additions & 18 deletions

File tree

pixie/vm/reader.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

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

276285
class UnmatchedMapReader(ReaderHandler):
@@ -335,7 +344,7 @@ def invoke(self, rdr, ch):
335344
acc.append(v)
336345

337346
def 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):
591600
class 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

606611
handlers = {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

tests/pixie/tests/test-readeval.pxi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,6 @@
5555
(t/assert-throws? RuntimeException
5656
"Unmatched string quote '\"'"
5757
(read-string "\"foo")))
58+
59+
(t/deftest test-comments-in-forms
60+
(t/assert= (read-string "(foo ; a comment\n )") '(foo)))

0 commit comments

Comments
 (0)