~ chicken-core (master) /tests/reader-tests.scm


 1;;;; reader-tests.scm
 2
 3(import (only chicken.io read-line read-string)
 4        (only chicken.port with-input-from-string with-output-to-string)
 5        chicken.read-syntax)
 6
 7(set-sharp-read-syntax! #\& (lambda (p) (read p) (values)))
 8(set-sharp-read-syntax! #\^ (lambda (p) (read p)))
 9(set-read-syntax! #\! (lambda (p) (read-line p) (values)))
10
11(define output
12  (with-output-to-string
13    (lambda ()
14      (print "hi") ! this is fortran
15      (print "foo") #&(print "amp-comment") (print "baz")
16      #^(print "bye"))))
17
18!! output:
19!! hi
20!! foo
21!! baz
22!! bye
23
24(assert (string=? output "hi\nfoo\nbaz\nbye\n"))
25(assert (string=? "   ." (with-input-from-string "\x20;\u0020\U00000020\056" read-string)))
26
27(set-read-syntax! #\! #f)
28(assert (equal? '! (with-input-from-string "! " read)))
29
30;; unicode
31
32(set-read-syntax! #\⋄ (lambda (p) (vector (read p))))
33
34(assert (equal? '#(99) (with-input-from-string "  ⋄99" read)))
35
36;; parameterized read-syntax
37
38(set-parameterized-read-syntax! #\& 
39  (lambda (p n) 
40    (let ((x (read p)))
41      (let loop ((n n))
42        (if (zero? n) '()
43            (cons x (loop (- n 1))))))))
44
45(assert (equal? '(4 4 4) (with-input-from-string "#3&4" read)))
Trap