~ chicken-core (chicken-5) 3e3ccd8dee517985cf84e4843ddd94d87fb55e7e
commit 3e3ccd8dee517985cf84e4843ddd94d87fb55e7e
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Sat Nov 5 20:41:07 2016 +0100
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Sun Nov 6 10:54:22 2016 +1300
Use "portable" keyword style when WRITEing.
This ensures s-expressions are readable. The selected keyword style of
the program that eventually reads it doesn't need to match the keyword
of the program that writes it.
Signed-off-by: Evan Hanson <evhan@foldling.org>
diff --git a/NEWS b/NEWS
index 7f0975cb..3d785825 100644
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,8 @@
added for testing whether a port is open in a specific direction.
- An `include-relative` form has been added to the chicken module.
This works like `load-relative` but for textual inclusion.
+ - Keywords are now always written in "portable" style by WRITE, so
+ that the reader's keyword style doesn't need to match the writer's.
- Module system
- The compiler has been modularised, for improved namespacing. This
diff --git a/library.scm b/library.scm
index 0ec0a57e..90beb8c8 100644
--- a/library.scm
+++ b/library.scm
@@ -4040,7 +4040,8 @@ EOF
((##core#inline "C_forwardedp" x) (outstr port "#<invalid forwarded object>"))
((##core#inline "C_symbolp" x)
(cond ((fx= 0 (##sys#byte (##sys#slot x 1) 0)) ; keyword
- (case ksp
+ ;; Force portable #: style for readable output
+ (case (and (not readable) ksp)
((#:prefix)
(outchr port #\:)
(outsym port x))
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index ac09485b..b928653a 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -341,7 +341,7 @@
(assert (string=? "foo bar" (symbol->string kw)))
(assert (string=? "foo bar:"
(with-output-to-string (lambda () (display kw)))))
- (assert (string=? "|foo bar|:"
+ (assert (string=? "#:|foo bar|"
(with-output-to-string (lambda () (write kw)))))))
(parameterize ((keyword-style #:prefix))
@@ -352,7 +352,7 @@
(assert (string=? "foo bar" (symbol->string kw)))
(assert (string=? ":foo bar"
(with-output-to-string (lambda () (display kw)))))
- (assert (string=? ":|foo bar|"
+ (assert (string=? "#:|foo bar|"
(with-output-to-string (lambda () (write kw)))))))
(assert (eq? '|#:| (string->symbol "#:")))
Trap