home: hub: zuo

Download patch

ref: 9e2aa26b0574b4ac53c838f6b59fd78f952c3923
parent: dcf77fa75d578d655ccb37d9d2b706d5eafcaa1a
author: Matthew Flatt <mflatt@racket-lang.org>
date: Fri Nov 10 05:54:11 CST 2023

repair reader for `.` after open parenthes/bracket

Closes #16

--- a/tests/read+print.zuo
+++ b/tests/read+print.zuo
@@ -20,6 +20,10 @@
 (check (~s 1 '(apple . pie) (string->uninterned-symbol "banana")) "1 (apple . pie) #<symbol:banana>")
 (check (~a 1 '(apple) "banana") "1(apple)banana")
 (check (~a 1 '(apple . pie) (string->uninterned-symbol "banana")) "1(apple . pie)banana")
+(check (~a 1 '(apple . pie) (string->uninterned-symbol "banana")) "1(apple . pie)banana")
+
+(check-fail (string-read "( . pie)") "misplaced `.`")
+(check-fail (string-read "[ . pie]") "misplaced `.`")
 
 (define table
   (list
--- a/zuo.c
+++ b/zuo.c
@@ -2121,9 +2121,13 @@
                        stack);
       obj = z.o_undefined;
     } else if ((c == '.') && !(isalpha(s[*_o+1]) || isdigit(s[*_o+1]) || strchr(symbol_chars, s[*_o+1]))) {
-      if ((stack != z.o_null) && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_PAREN_LIST_RECUR))
+      if ((stack != z.o_null)
+          && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_PAREN_LIST_RECUR)
+          && (ZUO_CAR(ZUO_CDR(ZUO_CAR(stack))) != z.o_null))
         ZUO_CAR(ZUO_CAR(stack)) = ZUO_IN_PAREN_PAIR_RECUR;
-      else if ((stack != z.o_null) && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_BRACKET_LIST_RECUR))
+      else if ((stack != z.o_null)
+               && (ZUO_CAR(ZUO_CAR(stack)) == ZUO_IN_BRACKET_LIST_RECUR)
+               && (ZUO_CAR(ZUO_CDR(ZUO_CAR(stack))) != z.o_null))
         ZUO_CAR(ZUO_CAR(stack)) = ZUO_IN_BRACKET_PAIR_RECUR;
       else
         zuo_read_fail(s, _o, where, "misplaced `.`");