~ chicken-r7rs (master) 0ae37044699af4f6840d2a1c05625ec84890f159
commit 0ae37044699af4f6840d2a1c05625ec84890f159
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Tue Jun 17 18:58:13 2014 +0000
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Tue Jun 17 18:58:13 2014 +0000
#![no-]fold-case, check read's argument type
diff --git a/scheme.read.scm b/scheme.read.scm
index d9a4fab..ba56b86 100644
--- a/scheme.read.scm
+++ b/scheme.read.scm
@@ -1,6 +1,45 @@
(module scheme.read (read)
(import (except scheme read)
- (only chicken : current-read-table fx+ fx= optional unless when))
+ (only chicken : current-read-table fx+ fx= optional unless when)
+ (only chicken case-sensitive define-constant define-inline parameterize))
+
+ ;;;
+ ;;; 2.1 Identifiers
+ ;;;
+
+ ;; XXX Slot 14 indicates whether or not a port is case-folded.
+ ;; Hopefully this doesn't interfere with anything else.
+
+ (define-constant port-fold-case-slot 14)
+
+ (define-inline (port-fold-case p)
+ (##sys#slot p port-fold-case-slot))
+
+ (##sys#set-read-mark!
+ 'fold-case
+ (lambda (p)
+ (##sys#setslot p port-fold-case-slot 'fold-case)
+ (read p)))
+
+ (##sys#set-read-mark!
+ 'no-fold-case
+ (lambda (p)
+ (##sys#setslot p port-fold-case-slot 'no-fold-case)
+ (read p)))
+
+ (set! ##sys#read
+ (let ((read ##sys#read))
+ (lambda (port hook)
+ (parameterize ((case-sensitive
+ (case (port-fold-case port)
+ ((fold-case) #f)
+ ((no-fold-case) #t)
+ (else (case-sensitive)))))
+ (read port hook)))))
+
+ ;;;
+ ;;; 6.13.2 Input
+ ;;;
(define (data? o)
(not (procedure? o)))
@@ -68,6 +107,7 @@
(##sys#setslot (##sys#slot read-table 3) 35 read-hash/shared)
(##sys#setslot (##sys#slot read-table 3) 61 read-equal/shared))
(lambda ()
+ (##sys#check-input-port port #t 'read)
(read/shared port))
(lambda ()
(##sys#setslot (##sys#slot read-table 3) 35 read-hash/orig)
diff --git a/tests/run.scm b/tests/run.scm
index e6abac7..454e6c6 100644
--- a/tests/run.scm
+++ b/tests/run.scm
@@ -19,6 +19,18 @@
(test-begin "r7rs tests")
+(test-group "2.1: Identifiers"
+ (test "#!(no-)fold-case"
+ '(FOO mooh qux blah foo BAR)
+ (append
+ (with-input-from-string
+ "FOO #!fold-case mooh QUX blah #!no-fold-case foo BAR" read-file)))
+ (test "#!(no-)fold-case only affects subsequent reads from the same port"
+ '(FOO bar baz downcased UPCASED)
+ (append
+ (with-input-from-string "FOO #!fold-case bar BAZ" read-file)
+ (with-input-from-string "downcased UPCASED" read-file))))
+
(test-group "4.1.7: Inclusion"
(test-group "include"
(test "multiple filenames"
Trap