~ chicken-core (chicken-5) e9cf59f8734ebdd0c774c223e574fd95dc022581
commit e9cf59f8734ebdd0c774c223e574fd95dc022581 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Dec 23 20:44:51 2018 +0100 Commit: Peter Bex <peter@more-magic.net> CommitDate: Sun Jan 20 12:32:23 2019 +0100 Preserve read/write invariance for symbols prefixed with "#!" Only #!rest, #!key and #!optional should be written, since they are the only symbols of that type recognised by the reader. Signed-off-by: Evan Hanson <evhan@foldling.org> Signed-off-by: Peter Bex <peter@more-magic.net> diff --git a/NEWS b/NEWS index a24d7e17..2b5e72dd 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +5.0.2 + +- Core libraries + - Read-write invariance of special symbols starting with #! other + than #!key, #!rest or #!optional is now preserved (#1572). + + 5.0.1 - Type system diff --git a/library.scm b/library.scm index 08c437df..6a089955 100644 --- a/library.scm +++ b/library.scm @@ -4501,8 +4501,7 @@ EOF (not (and (fx> len 2) (eq? (##core#inline "C_subchar" str 1) #\#) (not (eq? (##core#inline "C_subchar" str 2) #\#))))) - ;; #!rest, #!key etc - (eq? (##core#inline "C_subchar" str 1) #\!)) + (member str '("#!rest" "#!key" "#!optional"))) ((specialchar? c) #f) (else #t) ) ) (let ((c (##core#inline "C_subchar" str i))) diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm index 663aa40e..bd88ec14 100644 --- a/tests/syntax-tests.scm +++ b/tests/syntax-tests.scm @@ -275,7 +275,15 @@ (t '#!rest (with-input-from-string "#!rest" read)) (t '#!rest (with-input-from-string "|#!rest|" read)) (t "#!rest" (with-output-to-string (lambda () (write '#!rest)))) + +;; Non-special symbols starting with shebang +(f (with-input-from-string "#!foo" read)) +(t '|#!foo| (with-input-from-string "|#!foo|" read)) +(t "|#!foo|" (with-output-to-string (lambda () (write '|#!foo|)))) + +;; Namespaced symbols (t "foo#bar" (with-output-to-string (lambda () (write 'foo#bar)))) +(t "##foo#bar" (with-output-to-string (lambda () (write '##foo#bar)))) ;; These used to be treated specially, but now they just trigger an ;; "invalid sharp-sign read syntax" error.Trap