~ chicken-core (chicken-5) c1dc721cd9bf867e483a82b0ed83e6a1e6f11f50


commit c1dc721cd9bf867e483a82b0ed83e6a1e6f11f50
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Feb 19 01:36:16 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Feb 19 01:36:16 2011 +0100

    read-macro-handers now can return zero values (thanks to zbigniew)

diff --git a/library.scm b/library.scm
index 31c8b375..80669311 100644
--- a/library.scm
+++ b/library.scm
@@ -2691,12 +2691,14 @@ EOF
 	                '(#\[ #\] #\{ #\} #\|))))
 
 	  (r-spaces)
-	  (let* ([c (##sys#peek-char-0 port)]
-		 [srst (##sys#slot crt 1)]
-		 [h (and srst (##sys#slot srst (char->integer c)) ) ] )
+	  (let* ((c (##sys#peek-char-0 port))
+		 (srst (##sys#slot crt 1))
+		 (h (and srst (##sys#slot srst (char->integer c)) ) ) )
 	    (if h
 	        ;then handled by read-table entry
-		(h c port)
+		(##sys#call-with-values
+		 (lambda () (h c port))
+		 (lambda xs (if (null? xs) (readrec) (car xs))))
 		;otherwise chicken extended r5rs syntax
 		(case c
 		  ((#\')
@@ -2720,15 +2722,23 @@ EOF
 				(spdrst (##sys#slot crt 3)) 
 				(h (and spdrst (##sys#slot spdrst (char->integer dchar)) ) ) )
 	                         ;#<num> handled by parameterized # read-table entry?
-			   (cond (h (h dchar port n))
+			   (cond (h (##sys#call-with-values
+				     (lambda () (h dchar port n))
+				     (lambda xs (if (null? xs) (readrec) (car xs)))))
 			         ;#<num>?
-				 ((or (eq? dchar #\)) (char-whitespace? dchar)) (##sys#sharp-number-hook port n))
-				 (else (##sys#read-error port "invalid parameterized read syntax" dchar n) ) ) )
+				 ((or (eq? dchar #\)) (char-whitespace? dchar)) 
+				  (##sys#sharp-number-hook port n))
+				 (else (##sys#read-error
+					port
+					"invalid parameterized read syntax" 
+					dchar n) ) ) )
 			 (let* ((sdrst (##sys#slot crt 2))
 				(h (and sdrst (##sys#slot sdrst (char->integer dchar)) ) ) )
 			   (if h
 	                       ;then handled by # read-table entry
-			       (h dchar port)
+			       (##sys#call-with-values
+				(lambda () (h dchar port))
+				(lambda xs (if (null? xs) (readrec) (car xs))))
                 	       ;otherwise chicken extended r5rs syntax
 			       (case (char-downcase dchar)
 				 ((#\x) (##sys#read-char-0 port) (r-number-with-exactness 16))
@@ -2795,7 +2805,9 @@ EOF
 							  (##sys#read-error
 							   port
 							   "invalid `#!' token" tok) ) ) ] ) ) ) ) ) )
-				 (else (##sys#user-read-hook dchar port)) ) ) ) ) ) )
+				 (else
+				  (##sys#call-with-values (lambda () (##sys#user-read-hook dchar port))
+							  (lambda xs (if (null? xs) (readrec) (car xs)))) ) ) ) ) ) ) )
 		  ((#\() (r-list #\( #\)))
 		  ((#\)) (##sys#read-char-0 port) (container c))
 		  ((#\") (##sys#read-char-0 port) (r-string #\"))
diff --git a/tests/reader-tests.scm b/tests/reader-tests.scm
new file mode 100644
index 00000000..6d3e4f76
--- /dev/null
+++ b/tests/reader-tests.scm
@@ -0,0 +1,21 @@
+;;;; reader-tests.scm
+
+
+(set-sharp-read-syntax! #\& (lambda (p) (read p) (values)))
+(set-sharp-read-syntax! #\^ (lambda (p) (read p)))
+(set-read-syntax! #\! (lambda (p) (read-line p) (values)))
+
+(define output
+  (with-output-to-string
+    (lambda ()
+      (print "hi") ! this is fortran
+      (print "foo") #&(print "amp-comment") (print "baz")
+      #^(print "bye"))))
+
+!! output:
+!! hi
+!! foo
+!! baz
+!! bye
+
+(assert (string=? output "hi\nfoo\nbaz\nbye\n"))
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 7b670a88..1b76427d 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -95,6 +95,9 @@ $interpret -s records-and-setters-test.scm
 $compile records-and-setters-test.scm
 ./a.out
 
+echo "======================================== reader tests ..."
+$interpret -s reader-tests.scm
+
 echo "======================================== dynamic-wind tests ..."
 $interpret -s dwindtst.scm >dwindtst.out
 diff -bu dwindtst.expected dwindtst.out
Trap