~ chicken-r7rs (master) a89690390d8d86f6311338da39b7f885440e30ec
commit a89690390d8d86f6311338da39b7f885440e30ec
Author: Moritz Heidkamp <moritz@twoticketsplease.de>
AuthorDate: Mon May 27 07:22:14 2013 +0000
Commit: Moritz Heidkamp <moritz@twoticketsplease.de>
CommitDate: Mon May 27 07:22:14 2013 +0000
r7rs: Long boolean read syntax
diff --git a/r7rs.meta b/r7rs.meta
new file mode 100644
index 0000000..ced9daf
--- /dev/null
+++ b/r7rs.meta
@@ -0,0 +1,7 @@
+((synopsis "R7RS compatibility")
+ (author "The Chicken Team")
+ (category lang-exts)
+ (license "BSD")
+ (depends)
+ (test-depends)
+ (foreign-depends))
diff --git a/r7rs.scm b/r7rs.scm
new file mode 100644
index 0000000..687628b
--- /dev/null
+++ b/r7rs.scm
@@ -0,0 +1,26 @@
+(module r7rs
+
+()
+
+(import chicken scheme)
+(use srfi-13)
+
+(define (read-asserted-ci-symbol port valid-symbols error-message)
+ (let ((sym (##sys#read port ##sys#default-read-info-hook)))
+ (or (and (symbol? sym)
+ (memq (string->symbol (string-downcase (symbol->string sym))) valid-symbols))
+ (##sys#read-error port error-message sym))))
+
+(let ((old-hook ##sys#user-read-hook))
+ (set! ##sys#user-read-hook
+ (lambda (char port)
+ (case char
+ ((#\f #\F)
+ (read-asserted-ci-symbol port '(f false) "invalid `false' read syntax")
+ #f)
+ ((#\t #\T)
+ (read-asserted-ci-symbol port '(t true) "invalid `true' read syntax")
+ #t)
+ (else (old-hook))))))
+
+)
diff --git a/r7rs.setup b/r7rs.setup
new file mode 100644
index 0000000..8046c71
--- /dev/null
+++ b/r7rs.setup
@@ -0,0 +1,7 @@
+(compile -d0 -O2 -J -s r7rs.scm)
+(compile -d0 -O2 -s r7rs.import.scm)
+
+(install-extension
+ 'r7rs
+ '("r7rs.so" "r7rs.import.so")
+ '((version "0.0.1")))
diff --git a/tests/run.scm b/tests/run.scm
new file mode 100644
index 0000000..d15d114
--- /dev/null
+++ b/tests/run.scm
@@ -0,0 +1,11 @@
+(use r7rs test)
+
+(define (read-from-string s)
+ (with-input-from-string s read))
+
+(test-group "long boolean literalsa"
+ (test #t (read-from-string "#t"))
+ (test #f (read-from-string "#f"))
+ (test #t (read-from-string "#true"))
+ (test #f (read-from-string "#false"))
+ (test-error (read-from-string "#faux")))
Trap