~ chicken-core (chicken-5) a83213c4604239365ac3cd4b02f1e61bdd09c92c


commit a83213c4604239365ac3cd4b02f1e61bdd09c92c
Author:     alice maz <alice@alicemaz.com>
AuthorDate: Wed Aug 5 00:07:23 2020 -0500
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Wed Sep 9 22:21:14 2020 +1200

    Always treat bare colon as a symbol
    
    Fixes ##sys#read behavior in -keyword-style prefix to match suffix.
    
    Also fixes it to consume at most one colon in -keyword-style prefix.
    
    Fixes #1711.
    
    Signed-off-by: megane <meganeka@gmail.com>
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/library.scm b/library.scm
index c5015b7a..ab3b6397 100644
--- a/library.scm
+++ b/library.scm
@@ -4031,15 +4031,18 @@ EOF
 		(cond ((or (eof-object? c)
 			   (char-whitespace? c)
 			   (memq c terminating-characters))
-		       ;; The not null? checks here ensure we read a
-		       ;; plain ":" as a symbol, not as a keyword.
-		       ;; However, when the keyword is quoted like ||:,
-		       ;; it _should_ be read as a keyword.
-		       (if (and skw (eq? ksp #:suffix)
-				(or qtd (not (null? (cdr lst)))))
-			   (k (##sys#reverse-list->string (cdr lst)) #t)
-			   (k (##sys#reverse-list->string lst)
-			      (and pkw (or qtd (not (null? lst)))))))
+		       ;; The various cases here cover:
+		       ;; - Nonempty keywords formed with colon in the ksp position
+		       ;; - Empty keywords formed explicitly with vbar quotes
+		       ;; - Bare colon, which should always be a symbol
+		       (cond ((and skw (eq? ksp #:suffix) (or qtd (not (null? (cdr lst)))))
+			      (k (##sys#reverse-list->string (cdr lst)) #t))
+			     ((and pkw (eq? ksp #:prefix) (or qtd (not (null? lst))))
+			      (k (##sys#reverse-list->string lst) #t))
+			     ((and pkw (eq? ksp #:prefix) (not qtd) (null? lst))
+			      (k ":" #f))
+			     (else
+			      (k (##sys#reverse-list->string lst) #f))))
 		      ((memq c reserved-characters)
 		       (reserved-character c))
 		      (else
@@ -4056,6 +4059,7 @@ EOF
 			    (loop (cons #\newline lst) pkw #f qtd))
 			   ((#\:)
 			    (cond ((and (null? lst)
+					(not pkw)
 					(not qtd)
 					(eq? ksp #:prefix))
 				   (loop '() #t #f qtd))
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index dda075f7..d331871e 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -496,10 +496,17 @@
   (assert (not (keyword? (with-input-from-string ":abc:" read))))
   (assert (not (keyword? (with-input-from-string "abc:" read)))))
 
-(let ((colon-sym (with-input-from-string ":" read)))
-  (assert (symbol? colon-sym))
-  (assert (not (keyword? colon-sym)))
-  (assert (string=? ":" (symbol->string colon-sym))))
+(parameterize ((keyword-style #:suffix))
+  (let ((colon-sym (with-input-from-string ":" read)))
+    (assert (symbol? colon-sym))
+    (assert (not (keyword? colon-sym)))
+    (assert (string=? ":" (symbol->string colon-sym)))))
+
+(parameterize ((keyword-style #:prefix))
+  (let ((colon-sym (with-input-from-string ":" read)))
+    (assert (symbol? colon-sym))
+    (assert (not (keyword? colon-sym)))
+    (assert (string=? ":" (symbol->string colon-sym)))))
 
 ;; The next two cases are a bit dubious, but we follow SRFI-88 (see
 ;; also #1625).
Trap