~ chicken-core (chicken-5) /tests/r4rstest.scm
Trap1;; Copyright (C) 1991, 1992, 1993, 1994, 1995, 2000, 2003 Free Software Foundation, Inc.
2;;
3;; This program is free software; you can redistribute it and/or modify it
4;; under the terms of the GNU General Public License as published by the
5;; Free Software Foundation; either version 2, or (at your option) any
6;; later version.
7;;
8;; This program is distributed in the hope that it will be useful,
9;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11;; GNU General Public License for more details.
12;;
13;; To receive a copy of the GNU General Public License, write to the
14;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
15;; Boston, MA 02111-1307, USA; or view
16;; http://swissnet.ai.mit.edu/~jaffer/GPL.html
17
18;;;; "r4rstest.scm" Test correctness of scheme implementations.
19;;; Author: Aubrey Jaffer
20
21;;; This includes examples from
22;;; William Clinger and Jonathan Rees, editors.
23;;; Revised^4 Report on the Algorithmic Language Scheme
24;;; and the IEEE specification.
25
26;;; The input tests read this file expecting it to be named "r4rstest.scm".
27;;; Files `tmp1'.out, `tmp2.out' and `tmp3.out' will be created in the course
28;;; of running these tests. You may need to delete them in order to run
29;;; "r4rstest.scm" more than once.
30
31;;; There are three optional tests:
32;;; (TEST-CONT) tests multiple returns from call-with-current-continuation
33;;;
34;;; (TEST-SC4) tests procedures required by R4RS but not by IEEE
35;;;
36;;; (TEST-DELAY) tests DELAY and FORCE, which are not required by
37;;; either standard.
38
39;;; If you are testing a R3RS version which does not have `list?' do:
40;;; (define list? #f)
41
42;;; send corrections or additions to agj @ alum.mit.edu
43
44(define cur-section '())(define errs '())
45(define SECTION (lambda args
46 (display "SECTION") (write args) (newline)
47 (set! cur-section args) #t))
48(define record-error (lambda (e) (set! errs (cons (list cur-section e) errs))))
49
50(define test
51 (lambda (expect fun . args)
52 (write (cons fun args))
53 (display " ==> ")
54 ((lambda (res)
55 (write res)
56 (newline)
57 (cond ((not (equal? expect res))
58 (record-error (list res expect (cons fun args)))
59 (display " BUT EXPECTED ")
60 (write expect)
61 (newline)
62 #f)
63 (else #t)))
64 (if (procedure? fun) (apply fun args) (car args)))))
65(define (report-errs)
66 (newline)
67 (if (null? errs) (display "Passed all tests")
68 (begin
69 (display "errors were:")
70 (newline)
71 (display "(SECTION (got expected (call)))")
72 (newline)
73 (for-each (lambda (l) (write l) (newline))
74 errs)))
75 (newline))
76
77(SECTION 2 1);; test that all symbol characters are supported.
78'(+ - ... !.. $.+ %.- &.! *.: /:. :+. <-. =. >. ?. ~. _. ^.)
79
80(SECTION 3 4)
81(define disjoint-type-functions
82 (list boolean? char? null? number? pair? procedure? string? symbol? vector?))
83(define type-examples
84 (list
85 #t #f #\a '() 9739 '(test) record-error "test" "" 'test '#() '#(a b c) ))
86(define i 1)
87(for-each (lambda (x) (display (make-string i #\ ))
88 (set! i (+ 3 i))
89 (write x)
90 (newline))
91 disjoint-type-functions)
92(define type-matrix
93 (map (lambda (x)
94 (let ((t (map (lambda (f) (f x)) disjoint-type-functions)))
95 (write t)
96 (write x)
97 (newline)
98 t))
99 type-examples))
100(set! i 0)
101(define j 0)
102(for-each (lambda (x y)
103 (set! j (+ 1 j))
104 (set! i 0)
105 (for-each (lambda (f)
106 (set! i (+ 1 i))
107 (cond ((and (= i j))
108 (cond ((not (f x)) (test #t f x))))
109 ((f x) (test #f f x)))
110 (cond ((and (= i j))
111 (cond ((not (f y)) (test #t f y))))
112 ((f y) (test #f f y))))
113 disjoint-type-functions))
114 (list #t #\a '() 9739 '(test) record-error "test" 'car '#(a b c))
115 (list #f #\newline '() -3252 '(t . t) car "" 'nil '#()))
116(SECTION 4 1 2)
117(test '(quote a) 'quote (quote 'a))
118(test '(quote a) 'quote ''a)
119(SECTION 4 1 3)
120(test 12 (if #f + *) 3 4)
121(SECTION 4 1 4)
122(test 8 (lambda (x) (+ x x)) 4)
123(define reverse-subtract
124 (lambda (x y) (- y x)))
125(test 3 reverse-subtract 7 10)
126(define add4
127 (let ((x 4))
128 (lambda (y) (+ x y))))
129(test 10 add4 6)
130(test '(3 4 5 6) (lambda x x) 3 4 5 6)
131(test '(5 6) (lambda (x y . z) z) 3 4 5 6)
132(SECTION 4 1 5)
133(test 'yes 'if (if (> 3 2) 'yes 'no))
134(test 'no 'if (if (> 2 3) 'yes 'no))
135(test '1 'if (if (> 3 2) (- 3 2) (+ 3 2)))
136(SECTION 4 1 6)
137(define x 2)
138(test 3 'define (+ x 1))
139(set! x 4)
140(test 5 'set! (+ x 1))
141(SECTION 4 2 1)
142(test 'greater 'cond (cond ((> 3 2) 'greater)
143 ((< 3 2) 'less)))
144(test 'equal 'cond (cond ((> 3 3) 'greater)
145 ((< 3 3) 'less)
146 (else 'equal)))
147(test 2 'cond (cond ((assv 'b '((a 1) (b 2))) => cadr)
148 (else #f)))
149(test 'composite 'case (case (* 2 3)
150 ((2 3 5 7) 'prime)
151 ((1 4 6 8 9) 'composite)))
152(test 'consonant 'case (case (car '(c d))
153 ((a e i o u) 'vowel)
154 ((w y) 'semivowel)
155 (else 'consonant)))
156(test #t 'and (and (= 2 2) (> 2 1)))
157(test #f 'and (and (= 2 2) (< 2 1)))
158(test '(f g) 'and (and 1 2 'c '(f g)))
159(test #t 'and (and))
160(test #t 'or (or (= 2 2) (> 2 1)))
161(test #t 'or (or (= 2 2) (< 2 1)))
162(test #f 'or (or #f #f #f))
163(test #f 'or (or))
164(test '(b c) 'or (or (memq 'b '(a b c)) (+ 3 0)))
165(SECTION 4 2 2)
166(test 6 'let (let ((x 2) (y 3)) (* x y)))
167(test 35 'let (let ((x 2) (y 3)) (let ((x 7) (z (+ x y))) (* z x))))
168(test 70 'let* (let ((x 2) (y 3)) (let* ((x 7) (z (+ x y))) (* z x))))
169(test #t 'letrec (letrec ((even?
170 (lambda (n) (if (zero? n) #t (odd? (- n 1)))))
171 (odd?
172 (lambda (n) (if (zero? n) #f (even? (- n 1))))))
173 (even? 88)))
174(define x 34)
175(test 5 'let (let ((x 3)) (define x 5) x))
176(test 34 'let x)
177(test 6 'let (let () (define x 6) x))
178(test 34 'let x)
179(test 7 'let* (let* ((x 3)) (define x 7) x))
180(test 34 'let* x)
181(test 8 'let* (let* () (define x 8) x))
182(test 34 'let* x)
183(test 9 'letrec (letrec () (define x 9) x))
184(test 34 'letrec x)
185(test 10 'letrec (letrec ((x 3)) (define x 10) x))
186(test 34 'letrec x)
187(define (s x) (if x (let () (set! s x) (set! x s))))
188(SECTION 4 2 3)
189(define x 0)
190(test 6 'begin (begin (set! x (begin (begin 5)))
191 (begin ((begin +) (begin x) (begin (begin 1))))))
192(SECTION 4 2 4)
193(test '#(0 1 2 3 4) 'do (do ((vec (make-vector 5))
194 (i 0 (+ i 1)))
195 ((= i 5) vec)
196 (vector-set! vec i i)))
197(test 25 'do (let ((x '(1 3 5 7 9)))
198 (do ((x x (cdr x))
199 (sum 0 (+ sum (car x))))
200 ((null? x) sum))))
201(test 1 'let (let foo () 1))
202(test '((6 1 3) (-5 -2)) 'let
203 (let loop ((numbers '(3 -2 1 6 -5))
204 (nonneg '())
205 (neg '()))
206 (cond ((null? numbers) (list nonneg neg))
207 ((negative? (car numbers))
208 (loop (cdr numbers)
209 nonneg
210 (cons (car numbers) neg)))
211 (else
212 (loop (cdr numbers)
213 (cons (car numbers) nonneg)
214 neg)))))
215;;From: Allegro Petrofsky <Allegro@Petrofsky.Berkeley.CA.US>
216(test -1 'let (let ((f -)) (let f ((n (f 1))) n)))
217
218(SECTION 4 2 6)
219(test '(list 3 4) 'quasiquote `(list ,(+ 1 2) 4))
220(test '(list a (quote a)) 'quasiquote (let ((name 'a)) `(list ,name ',name)))
221(test '(a 3 4 5 6 b) 'quasiquote `(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b))
222(test '((foo 7) . cons)
223 'quasiquote
224 `((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))))
225
226;;; sqt is defined here because not all implementations are required to
227;;; support it.
228(define (sqt x)
229 (do ((i 0 (+ i 1)))
230 ((> (* i i) x) (- i 1))))
231
232(test '#(10 5 2 4 3 8) 'quasiquote `#(10 5 ,(sqt 4) ,@(map sqt '(16 9)) 8))
233(test 5 'quasiquote `,(+ 2 3))
234(test '(a `(b ,(+ 1 2) ,(foo 4 d) e) f)
235 'quasiquote `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f))
236(test '(a `(b ,x ,'y d) e) 'quasiquote
237 (let ((name1 'x) (name2 'y)) `(a `(b ,,name1 ,',name2 d) e)))
238(test '(list 3 4) 'quasiquote (quasiquote (list (unquote (+ 1 2)) 4)))
239(test '`(list ,(+ 1 2) 4) 'quasiquote '(quasiquote (list (unquote (+ 1 2)) 4)))
240(SECTION 5 2 1)
241(define add3 (lambda (x) (+ x 3)))
242(test 6 'define (add3 3))
243(define first car)
244(test 1 'define (first '(1 2)))
245(define old-+ +)
246(begin (begin (begin)
247 (begin (begin (begin) (define + (lambda (x y) (list y x)))
248 (begin)))
249 (begin))
250 (begin)
251 (begin (begin (begin) (test '(3 6) add3 6)
252 (begin))))
253(set! + old-+)
254(test 9 add3 6)
255(begin)
256(begin (begin))
257(begin (begin (begin (begin))))
258(SECTION 5 2 2)
259#;(test 45 'define
260 (let ((x 5))
261 (begin (begin (begin)
262 (begin (begin (begin) (define foo (lambda (y) (bar x y)))
263 (begin)))
264 (begin))
265 (begin)
266 (begin)
267 (begin (define bar (lambda (a b) (+ (* a b) a))))
268 (begin))
269 (begin)
270 (begin (foo (+ x 3)))))
271(define x 34)
272(define (foo) (define x 5) x)
273(test 5 foo)
274(test 34 'define x)
275(define foo (lambda () (define x 5) x))
276(test 5 foo)
277(test 34 'define x)
278(define (foo x) ((lambda () (define x 5) x)) x)
279(test 88 foo 88)
280(test 4 foo 4)
281(test 34 'define x)
282(test 99 'internal-define (letrec ((foo (lambda (arg)
283 (or arg (and (procedure? foo)
284 (foo 99))))))
285 (define bar (foo #f))
286 (foo #f)))
287(test 77 'internal-define (letrec ((foo 77)
288 (bar #f)
289 (retfoo (lambda () foo)))
290 (define baz (retfoo))
291 (retfoo)))
292(SECTION 6 1)
293(test #f not #t)
294(test #f not 3)
295(test #f not (list 3))
296(test #t not #f)
297(test #f not '())
298(test #f not (list))
299(test #f not 'nil)
300
301;(test #t boolean? #f)
302;(test #f boolean? 0)
303;(test #f boolean? '())
304(SECTION 6 2)
305(test #t eqv? 'a 'a)
306(test #f eqv? 'a 'b)
307(test #t eqv? 2 2)
308(test #t eqv? '() '())
309(test #t eqv? '10000 '10000)
310(test #f eqv? (cons 1 2)(cons 1 2))
311(test #f eqv? (lambda () 1) (lambda () 2))
312(test #f eqv? #f 'nil)
313(let ((p (lambda (x) x)))
314 (test #t eqv? p p))
315(define gen-counter
316 (lambda ()
317 (let ((n 0))
318 (lambda () (set! n (+ n 1)) n))))
319(let ((g (gen-counter))) (test #t eqv? g g))
320(test #f eqv? (gen-counter) (gen-counter))
321(letrec ((f (lambda () (if (eqv? f g) 'f 'both)))
322 (g (lambda () (if (eqv? f g) 'g 'both))))
323 (test #f eqv? f g))
324
325(test #t eq? 'a 'a)
326(test #f eq? (list 'a) (list 'a))
327(test #t eq? '() '())
328(test #t eq? car car)
329(let ((x '(a))) (test #t eq? x x))
330(let ((x '#())) (test #t eq? x x))
331(let ((x (lambda (x) x))) (test #t eq? x x))
332
333(define test-eq?-eqv?-agreement
334 (lambda (obj1 obj2)
335 (cond ((eq? (eq? obj1 obj2) (eqv? obj1 obj2)))
336 (else
337 (record-error (list #f #t (list 'test-eq?-eqv?-agreement obj1 obj2)))
338 (display "eqv? and eq? disagree about ")
339 (write obj1)
340 (display #\ )
341 (write obj2)
342 (newline)))))
343
344(test-eq?-eqv?-agreement '#f '#f)
345(test-eq?-eqv?-agreement '#t '#t)
346(test-eq?-eqv?-agreement '#t '#f)
347(test-eq?-eqv?-agreement '(a) '(a))
348(test-eq?-eqv?-agreement '(a) '(b))
349(test-eq?-eqv?-agreement car car)
350(test-eq?-eqv?-agreement car cdr)
351(test-eq?-eqv?-agreement (list 'a) (list 'a))
352(test-eq?-eqv?-agreement (list 'a) (list 'b))
353(test-eq?-eqv?-agreement '#(a) '#(a))
354(test-eq?-eqv?-agreement '#(a) '#(b))
355(test-eq?-eqv?-agreement "abc" "abc")
356(test-eq?-eqv?-agreement "abc" "abz")
357
358(test #t equal? 'a 'a)
359(test #t equal? '(a) '(a))
360(test #t equal? '(a (b) c) '(a (b) c))
361(test #t equal? "abc" "abc")
362(test #t equal? 2 2)
363(test #t equal? (make-vector 5 'a) (make-vector 5 'a))
364(SECTION 6 3)
365(test '(a b c d e) 'dot '(a . (b . (c . (d . (e . ()))))))
366(define x (list 'a 'b 'c))
367(define y x)
368(and list? (test #t list? y))
369(set-cdr! x 4)
370(test '(a . 4) 'set-cdr! x)
371(test #t eqv? x y)
372(test '(a b c . d) 'dot '(a . (b . (c . d))))
373(and list? (test #f list? y))
374(and list? (let ((x (list 'a))) (set-cdr! x x) (test #f 'list? (list? x))))
375
376;(test #t pair? '(a . b))
377;(test #t pair? '(a . 1))
378;(test #t pair? '(a b c))
379;(test #f pair? '())
380;(test #f pair? '#(a b))
381
382(test '(a) cons 'a '())
383(test '((a) b c d) cons '(a) '(b c d))
384(test '("a" b c) cons "a" '(b c))
385(test '(a . 3) cons 'a 3)
386(test '((a b) . c) cons '(a b) 'c)
387
388(test 'a car '(a b c))
389(test '(a) car '((a) b c d))
390(test 1 car '(1 . 2))
391
392(test '(b c d) cdr '((a) b c d))
393(test 2 cdr '(1 . 2))
394
395(test '(a 7 c) list 'a (+ 3 4) 'c)
396(test '() list)
397
398(test 3 length '(a b c))
399(test 3 length '(a (b) (c d e)))
400(test 0 length '())
401
402(test '(x y) append '(x) '(y))
403(test '(a b c d) append '(a) '(b c d))
404(test '(a (b) (c)) append '(a (b)) '((c)))
405(test '() append)
406(test '(a b c . d) append '(a b) '(c . d))
407(test 'a append '() 'a)
408
409(test '(c b a) reverse '(a b c))
410(test '((e (f)) d (b c) a) reverse '(a (b c) d (e (f))))
411
412(test 'c list-ref '(a b c d) 2)
413
414(test '(a b c) memq 'a '(a b c))
415(test '(b c) memq 'b '(a b c))
416(test '#f memq 'a '(b c d))
417(test '#f memq (list 'a) '(b (a) c))
418(test '((a) c) member (list 'a) '(b (a) c))
419(test '(101 102) memv 101 '(100 101 102))
420
421(define e '((a 1) (b 2) (c 3)))
422(test '(a 1) assq 'a e)
423(test '(b 2) assq 'b e)
424(test #f assq 'd e)
425(test #f assq (list 'a) '(((a)) ((b)) ((c))))
426(test '((a)) assoc (list 'a) '(((a)) ((b)) ((c))))
427(test '(5 7) assv 5 '((2 3) (5 7) (11 13)))
428(SECTION 6 4)
429;(test #t symbol? 'foo)
430(test #t symbol? (car '(a b)))
431;(test #f symbol? "bar")
432;(test #t symbol? 'nil)
433;(test #f symbol? '())
434;(test #f symbol? #f)
435;;; But first, what case are symbols in? Determine the standard case:
436(define char-standard-case char-upcase)
437(if (string=? (symbol->string 'A) "a")
438 (set! char-standard-case char-downcase))
439(test #t 'standard-case
440 (string=? (symbol->string 'a) (symbol->string 'A)))
441(test #t 'standard-case
442 (or (string=? (symbol->string 'a) "A")
443 (string=? (symbol->string 'A) "a")))
444(define (str-copy s)
445 (let ((v (make-string (string-length s))))
446 (do ((i (- (string-length v) 1) (- i 1)))
447 ((< i 0) v)
448 (string-set! v i (string-ref s i)))))
449(define (string-standard-case s)
450 (set! s (str-copy s))
451 (do ((i 0 (+ 1 i))
452 (sl (string-length s)))
453 ((>= i sl) s)
454 (string-set! s i (char-standard-case (string-ref s i)))))
455(test (string-standard-case "flying-fish") symbol->string 'flying-fish)
456(test (string-standard-case "martin") symbol->string 'Martin)
457(test "Malvina" symbol->string (string->symbol "Malvina"))
458(test #t 'standard-case (eq? 'a 'A))
459
460(define x (string #\a #\b))
461(define y (string->symbol x))
462(string-set! x 0 #\c)
463(test "cb" 'string-set! x)
464(test "ab" symbol->string y)
465(test y string->symbol "ab")
466
467(test #t eq? 'mISSISSIppi 'mississippi)
468(test #f 'string->symbol (eq? 'bitBlt (string->symbol "bitBlt")))
469(test 'JollyWog string->symbol (symbol->string 'JollyWog))
470
471(SECTION 6 5 5)
472(test #t number? 3)
473(test #t complex? 3)
474(test #t real? 3)
475(test #t rational? 3)
476(test #t integer? 3)
477
478(test #t exact? 3)
479(test #f inexact? 3)
480
481(test #t = 22 22 22)
482(test #t = 22 22)
483(test #f = 34 34 35)
484(test #f = 34 35)
485(test #t > 3 -6246)
486(test #f > 9 9 -2424)
487(test #t >= 3 -4 -6246)
488(test #t >= 9 9)
489(test #f >= 8 9)
490(test #t < -1 2 3 4 5 6 7 8)
491(test #f < -1 2 3 4 4 5 6 7)
492(test #t <= -1 2 3 4 5 6 7 8)
493(test #t <= -1 2 3 4 4 5 6 7)
494(test #f < 1 3 2)
495(test #f >= 1 3 2)
496
497(test #t zero? 0)
498(test #f zero? 1)
499(test #f zero? -1)
500(test #f zero? -100)
501(test #t positive? 4)
502(test #f positive? -4)
503(test #f positive? 0)
504(test #f negative? 4)
505(test #t negative? -4)
506(test #f negative? 0)
507(test #t odd? 3)
508(test #f odd? 2)
509(test #f odd? -4)
510(test #t odd? -1)
511(test #f even? 3)
512(test #t even? 2)
513(test #t even? -4)
514(test #f even? -1)
515
516(test 38 max 34 5 7 38 6)
517(test -24 min 3 5 5 330 4 -24)
518
519(test 7 + 3 4)
520(test '3 + 3)
521(test 0 +)
522(test 4 * 4)
523(test 1 *)
524
525(test -1 - 3 4)
526(test -3 - 3)
527(test 7 abs -7)
528(test 7 abs 7)
529(test 0 abs 0)
530
531(test 5 quotient 35 7)
532(test -5 quotient -35 7)
533(test -5 quotient 35 -7)
534(test 5 quotient -35 -7)
535(test 1 modulo 13 4)
536(test 1 remainder 13 4)
537(test 3 modulo -13 4)
538(test -1 remainder -13 4)
539(test -3 modulo 13 -4)
540(test 1 remainder 13 -4)
541(test -1 modulo -13 -4)
542(test -1 remainder -13 -4)
543(test 0 modulo 0 86400)
544(test 0 modulo 0 -86400)
545(define (divtest n1 n2)
546 (= n1 (+ (* n2 (quotient n1 n2))
547 (remainder n1 n2))))
548(test #t divtest 238 9)
549(test #t divtest -238 9)
550(test #t divtest 238 -9)
551(test #t divtest -238 -9)
552
553(test 4 gcd 0 4)
554(test 4 gcd -4 0)
555(test 4 gcd 32 -36)
556(test 0 gcd)
557(test 288 lcm 32 -36)
558(test 1 lcm)
559
560(SECTION 6 5 5)
561;;; Implementations which don't allow division by 0 can have fragile
562;;; string->number.
563(define (test-string->number str)
564 (define ans (string->number str))
565 (cond ((not ans) #t) ((number? ans) #t) (else ans)))
566(for-each (lambda (str) (test #t test-string->number str))
567 '("+#.#" "-#.#" "#.#" "1/0" "-1/0" "0/0"
568 "+1/0i" "-1/0i" "0/0i" "0/0-0/0i" "1/0-1/0i" "-1/0+1/0i"
569 "#i" "#e" "#" "#i0/0"))
570(cond ((number? (string->number "1+1i")) ;More kawa bait
571 (test #t number? (string->number "#i-i"))
572 (test #t number? (string->number "#i+i"))
573 (test #t number? (string->number "#i2+i"))))
574
575;;;;From: fred@sce.carleton.ca (Fred J Kaudel)
576;;; Modified by jaffer.
577(define (test-inexact)
578 (define f3.9 (string->number "3.9"))
579 (define f4.0 (string->number "4.0"))
580 (define f-3.25 (string->number "-3.25"))
581 (define f.25 (string->number ".25"))
582 (define f4.5 (string->number "4.5"))
583 (define f3.5 (string->number "3.5"))
584 (define f0.0 (string->number "0.0"))
585 (define f0.8 (string->number "0.8"))
586 (define f1.0 (string->number "1.0"))
587 (define wto write-test-obj)
588 (define lto load-test-obj)
589 (newline)
590 (display ";testing inexact numbers; ")
591 (newline)
592 (SECTION 6 2)
593 (test #f eqv? 1 f1.0)
594 (test #f eqv? 0 f0.0)
595 (SECTION 6 5 5)
596 (test #t inexact? f3.9)
597 (test #t 'max (inexact? (max f3.9 4)))
598 (test f4.0 max f3.9 4)
599 (test f4.0 exact->inexact 4)
600 (test f4.0 exact->inexact 4.0)
601 (test 4 inexact->exact 4)
602 (test 4 inexact->exact 4.0)
603 (test (- f4.0) round (- f4.5))
604 (test (- f4.0) round (- f3.5))
605 (test (- f4.0) round (- f3.9))
606 (test f0.0 round f0.0)
607 (test f0.0 round f.25)
608 (test f1.0 round f0.8)
609 (test f4.0 round f3.5)
610 (test f4.0 round f4.5)
611 (test 1 expt 0 0)
612 (test 0 expt 0 1)
613 (test (atan 1) atan 1 1)
614 (set! write-test-obj (list f.25 f-3.25));.25 inexact errors less likely.
615 (set! load-test-obj (list 'define 'foo (list 'quote write-test-obj)))
616 (test #t call-with-output-file
617 "tmp3.out"
618 (lambda (test-file)
619 (write-char #\; test-file)
620 (display #\; test-file)
621 (display ";" test-file)
622 (write write-test-obj test-file)
623 (newline test-file)
624 (write load-test-obj test-file)
625 (output-port? test-file)))
626 (check-test-file "tmp3.out")
627 (set! write-test-obj wto)
628 (set! load-test-obj lto)
629 (let ((x (string->number "4195835.0"))
630 (y (string->number "3145727.0")))
631 (test #t 'pentium-fdiv-bug (> f1.0 (- x (* (/ x y) y)))))
632 (report-errs))
633
634(define (test-inexact-printing)
635 (let ((f0.0 (string->number "0.0"))
636 (f0.5 (string->number "0.5"))
637 (f1.0 (string->number "1.0"))
638 (f2.0 (string->number "2.0")))
639 (define log2
640 (let ((l2 (log 2)))
641 (lambda (x) (/ (log x) l2))))
642
643 (define (slow-frexp x)
644 (if (zero? x)
645 (list f0.0 0)
646 (let* ((l2 (log2 x))
647 (e (floor (log2 x)))
648 (e (if (= l2 e)
649 (inexact->exact e)
650 (+ (inexact->exact e) 1)))
651 (f (/ x (expt 2 e))))
652 (list f e))))
653
654 (define float-precision
655 (let ((mantissa-bits
656 (do ((i 0 (+ i 1))
657 (eps f1.0 (* f0.5 eps)))
658 ((= f1.0 (+ f1.0 eps))
659 i)))
660 (minval
661 (do ((x f1.0 (* f0.5 x)))
662 ((zero? (* f0.5 x)) x))))
663 (lambda (x)
664 (apply (lambda (f e)
665 (let ((eps
666 (cond ((= f1.0 f) (expt f2.0 (+ 1 (- e mantissa-bits))))
667 ((zero? f) minval)
668 (else (expt f2.0 (- e mantissa-bits))))))
669 (if (zero? eps) ;Happens if gradual underflow.
670 minval
671 eps)))
672 (slow-frexp x)))))
673
674 (define (float-print-test x)
675 (define (testit number)
676 (eqv? number (string->number (number->string number))))
677 (let ((eps (float-precision x))
678 (all-ok? #t))
679 (do ((j -100 (+ j 1)))
680 ((or (not all-ok?) (> j 100)) all-ok?)
681 (let* ((xx (+ x (* j eps)))
682 (ok? (testit xx)))
683 (cond ((not ok?)
684 (display "Number readback failure for ")
685 (display `(+ ,x (* ,j ,eps)))
686 (newline)
687 (display xx)
688 (newline)
689 (set! all-ok? #f))
690 ;; (else (display xx) (newline))
691 )))))
692
693 (define (mult-float-print-test x)
694 (let ((res #t))
695 (for-each
696 (lambda (mult)
697 (or (float-print-test (* mult x)) (set! res #f)))
698 (map string->number
699 '("1.0" "10.0" "100.0" "1.0e20" "1.0e50" "1.0e100"
700 "0.1" "0.01" "0.001" "1.0e-20" "1.0e-50" "1.0e-100")))
701 res))
702
703 (SECTION 6 5 6)
704 (test #t 'float-print-test (float-print-test f0.0))
705 (test #t 'mult-float-print-test (mult-float-print-test f1.0))
706 (test #t 'mult-float-print-test (mult-float-print-test
707 (string->number "3.0")))
708 (test #t 'mult-float-print-test (mult-float-print-test
709 (string->number "7.0")))
710 (test #t 'mult-float-print-test (mult-float-print-test
711 (string->number "3.1415926535897931")))
712 (test #t 'mult-float-print-test (mult-float-print-test
713 (string->number "2.7182818284590451")))))
714
715(define (test-bignum)
716 (define tb
717 (lambda (n1 n2)
718 (= n1 (+ (* n2 (quotient n1 n2))
719 (remainder n1 n2)))))
720 (newline)
721 (display ";testing bignums; ")
722 (newline)
723 (SECTION 6 5 7)
724 (test 0 modulo 33333333333333333333 3)
725 (test 0 modulo 33333333333333333333 -3)
726 (test 0 remainder 33333333333333333333 3)
727 (test 0 remainder 33333333333333333333 -3)
728 (test 2 modulo 33333333333333333332 3)
729 (test -1 modulo 33333333333333333332 -3)
730 (test 2 remainder 33333333333333333332 3)
731 (test 2 remainder 33333333333333333332 -3)
732 (test 1 modulo -33333333333333333332 3)
733 (test -2 modulo -33333333333333333332 -3)
734 (test -2 remainder -33333333333333333332 3)
735 (test -2 remainder -33333333333333333332 -3)
736
737 (test 3 modulo 3 33333333333333333333)
738 (test 33333333333333333330 modulo -3 33333333333333333333)
739 (test 3 remainder 3 33333333333333333333)
740 (test -3 remainder -3 33333333333333333333)
741 (test -33333333333333333330 modulo 3 -33333333333333333333)
742 (test -3 modulo -3 -33333333333333333333)
743 (test 3 remainder 3 -33333333333333333333)
744 (test -3 remainder -3 -33333333333333333333)
745
746 (test 0 modulo -2177452800 86400)
747 (test 0 modulo 2177452800 -86400)
748 (test 0 modulo 2177452800 86400)
749 (test 0 modulo -2177452800 -86400)
750 (test 0 modulo 0 -2177452800)
751 (test #t 'remainder (tb 281474976710655325431 65535))
752 (test #t 'remainder (tb 281474976710655325430 65535))
753
754 (SECTION 6 5 8)
755 (test 281474976710655325431 string->number "281474976710655325431")
756 (test "281474976710655325431" number->string 281474976710655325431)
757 (report-errs))
758
759(define (test-numeric-predicates)
760 (display "Skipping bignum-inexact comparisons due to printing inconsistencies")
761 ;; Windows prints the exponent with a leading zero, so the diff will break
762 #;(let* ((big-ex (expt 2 90))
763 (big-inex (exact->inexact big-ex)))
764 (newline)
765 (display ";testing bignum-inexact comparisons;")
766 (newline)
767 (SECTION 6 5 5)
768 (test #f = (+ big-ex 1) big-inex (- big-ex 1))
769 (test #f = big-inex (+ big-ex 1) (- big-ex 1))
770 (test #t < (- (inexact->exact big-inex) 1)
771 big-inex
772 (+ (inexact->exact big-inex) 1))))
773
774
775(SECTION 6 5 9)
776(test "0" number->string 0)
777(test "100" number->string 100)
778(test "100" number->string 256 16)
779(test 100 string->number "100")
780(test 256 string->number "100" 16)
781(test #f string->number "")
782(test #f string->number ".")
783(test #f string->number "d")
784(test #f string->number "D")
785(test #f string->number "i")
786(test #f string->number "I")
787(test #f string->number "3i")
788(test #f string->number "3I")
789(test #f string->number "33i")
790(test #f string->number "33I")
791(test #f string->number "3.3i")
792(test #f string->number "3.3I")
793(test #f string->number "-")
794(test #f string->number "+")
795(test #t 'string->number (or (not (string->number "80000000" 16))
796 (positive? (string->number "80000000" 16))))
797(test #t 'string->number (or (not (string->number "-80000000" 16))
798 (negative? (string->number "-80000000" 16))))
799
800(SECTION 6 6)
801;(test #t eqv? '#\ #\Space)
802;(test #t eqv? #\space '#\Space)
803(test #t char? #\a)
804(test #t char? #\()
805(test #t char? #\ )
806(test #t char? '#\newline)
807
808(test #f char=? #\A #\B)
809(test #f char=? #\a #\b)
810(test #f char=? #\9 #\0)
811(test #t char=? #\A #\A)
812
813(test #t char<? #\A #\B)
814(test #t char<? #\a #\b)
815(test #f char<? #\9 #\0)
816(test #f char<? #\A #\A)
817
818(test #f char>? #\A #\B)
819(test #f char>? #\a #\b)
820(test #t char>? #\9 #\0)
821(test #f char>? #\A #\A)
822
823(test #t char<=? #\A #\B)
824(test #t char<=? #\a #\b)
825(test #f char<=? #\9 #\0)
826(test #t char<=? #\A #\A)
827
828(test #f char>=? #\A #\B)
829(test #f char>=? #\a #\b)
830(test #t char>=? #\9 #\0)
831(test #t char>=? #\A #\A)
832
833(test #f char-ci=? #\A #\B)
834(test #f char-ci=? #\a #\B)
835(test #f char-ci=? #\A #\b)
836(test #f char-ci=? #\a #\b)
837(test #f char-ci=? #\9 #\0)
838(test #t char-ci=? #\A #\A)
839(test #t char-ci=? #\A #\a)
840
841(test #t char-ci<? #\A #\B)
842(test #t char-ci<? #\a #\B)
843(test #t char-ci<? #\A #\b)
844(test #t char-ci<? #\a #\b)
845(test #f char-ci<? #\9 #\0)
846(test #f char-ci<? #\A #\A)
847(test #f char-ci<? #\A #\a)
848
849(test #f char-ci>? #\A #\B)
850(test #f char-ci>? #\a #\B)
851(test #f char-ci>? #\A #\b)
852(test #f char-ci>? #\a #\b)
853(test #t char-ci>? #\9 #\0)
854(test #f char-ci>? #\A #\A)
855(test #f char-ci>? #\A #\a)
856
857(test #t char-ci<=? #\A #\B)
858(test #t char-ci<=? #\a #\B)
859(test #t char-ci<=? #\A #\b)
860(test #t char-ci<=? #\a #\b)
861(test #f char-ci<=? #\9 #\0)
862(test #t char-ci<=? #\A #\A)
863(test #t char-ci<=? #\A #\a)
864
865(test #f char-ci>=? #\A #\B)
866(test #f char-ci>=? #\a #\B)
867(test #f char-ci>=? #\A #\b)
868(test #f char-ci>=? #\a #\b)
869(test #t char-ci>=? #\9 #\0)
870(test #t char-ci>=? #\A #\A)
871(test #t char-ci>=? #\A #\a)
872
873(test #t char-alphabetic? #\a)
874(test #t char-alphabetic? #\A)
875(test #t char-alphabetic? #\z)
876(test #t char-alphabetic? #\Z)
877(test #f char-alphabetic? #\0)
878(test #f char-alphabetic? #\9)
879(test #f char-alphabetic? #\space)
880(test #f char-alphabetic? #\;)
881
882(test #f char-numeric? #\a)
883(test #f char-numeric? #\A)
884(test #f char-numeric? #\z)
885(test #f char-numeric? #\Z)
886(test #t char-numeric? #\0)
887(test #t char-numeric? #\9)
888(test #f char-numeric? #\space)
889(test #f char-numeric? #\;)
890
891(test #f char-whitespace? #\a)
892(test #f char-whitespace? #\A)
893(test #f char-whitespace? #\z)
894(test #f char-whitespace? #\Z)
895(test #f char-whitespace? #\0)
896(test #f char-whitespace? #\9)
897(test #t char-whitespace? #\space)
898(test #f char-whitespace? #\;)
899
900(test #f char-upper-case? #\0)
901(test #f char-upper-case? #\9)
902(test #f char-upper-case? #\space)
903(test #f char-upper-case? #\;)
904
905(test #f char-lower-case? #\0)
906(test #f char-lower-case? #\9)
907(test #f char-lower-case? #\space)
908(test #f char-lower-case? #\;)
909
910(test #\. integer->char (char->integer #\.))
911(test #\A integer->char (char->integer #\A))
912(test #\a integer->char (char->integer #\a))
913(test #\A char-upcase #\A)
914(test #\A char-upcase #\a)
915(test #\a char-downcase #\A)
916(test #\a char-downcase #\a)
917(SECTION 6 7)
918(test #t string? "The word \"recursion\\\" has many meanings.")
919;(test #t string? "")
920(define f (make-string 3 #\*))
921(test "?**" 'string-set! (begin (string-set! f 0 #\?) f))
922(test "abc" string #\a #\b #\c)
923(test "" string)
924(test 3 string-length "abc")
925(test #\a string-ref "abc" 0)
926(test #\c string-ref "abc" 2)
927(test 0 string-length "")
928(test "" substring "ab" 0 0)
929(test "" substring "ab" 1 1)
930(test "" substring "ab" 2 2)
931(test "a" substring "ab" 0 1)
932(test "b" substring "ab" 1 2)
933(test "ab" substring "ab" 0 2)
934(test "foobar" string-append "foo" "bar")
935(test "foo" string-append "foo")
936(test "foo" string-append "foo" "")
937(test "foo" string-append "" "foo")
938(test "" string-append)
939(test "" make-string 0)
940(test #t string=? "" "")
941(test #f string<? "" "")
942(test #f string>? "" "")
943(test #t string<=? "" "")
944(test #t string>=? "" "")
945(test #t string-ci=? "" "")
946(test #f string-ci<? "" "")
947(test #f string-ci>? "" "")
948(test #t string-ci<=? "" "")
949(test #t string-ci>=? "" "")
950
951(test #f string=? "A" "B")
952(test #f string=? "a" "b")
953(test #f string=? "9" "0")
954(test #t string=? "A" "A")
955
956(test #t string<? "A" "B")
957(test #t string<? "a" "b")
958(test #f string<? "9" "0")
959(test #f string<? "A" "A")
960
961(test #f string>? "A" "B")
962(test #f string>? "a" "b")
963(test #t string>? "9" "0")
964(test #f string>? "A" "A")
965
966(test #t string<=? "A" "B")
967(test #t string<=? "a" "b")
968(test #f string<=? "9" "0")
969(test #t string<=? "A" "A")
970
971(test #f string>=? "A" "B")
972(test #f string>=? "a" "b")
973(test #t string>=? "9" "0")
974(test #t string>=? "A" "A")
975
976(test #f string-ci=? "A" "B")
977(test #f string-ci=? "a" "B")
978(test #f string-ci=? "A" "b")
979(test #f string-ci=? "a" "b")
980(test #f string-ci=? "9" "0")
981(test #t string-ci=? "A" "A")
982(test #t string-ci=? "A" "a")
983
984(test #t string-ci<? "A" "B")
985(test #t string-ci<? "a" "B")
986(test #t string-ci<? "A" "b")
987(test #t string-ci<? "a" "b")
988(test #f string-ci<? "9" "0")
989(test #f string-ci<? "A" "A")
990(test #f string-ci<? "A" "a")
991
992(test #f string-ci>? "A" "B")
993(test #f string-ci>? "a" "B")
994(test #f string-ci>? "A" "b")
995(test #f string-ci>? "a" "b")
996(test #t string-ci>? "9" "0")
997(test #f string-ci>? "A" "A")
998(test #f string-ci>? "A" "a")
999
1000(test #t string-ci<=? "A" "B")
1001(test #t string-ci<=? "a" "B")
1002(test #t string-ci<=? "A" "b")
1003(test #t string-ci<=? "a" "b")
1004(test #f string-ci<=? "9" "0")
1005(test #t string-ci<=? "A" "A")
1006(test #t string-ci<=? "A" "a")
1007
1008(test #f string-ci>=? "A" "B")
1009(test #f string-ci>=? "a" "B")
1010(test #f string-ci>=? "A" "b")
1011(test #f string-ci>=? "a" "b")
1012(test #t string-ci>=? "9" "0")
1013(test #t string-ci>=? "A" "A")
1014(test #t string-ci>=? "A" "a")
1015(SECTION 6 8)
1016(test #t vector? '#(0 (2 2 2 2) "Anna"))
1017;(test #t vector? '#())
1018(test '#(a b c) vector 'a 'b 'c)
1019(test '#() vector)
1020(test 3 vector-length '#(0 (2 2 2 2) "Anna"))
1021(test 0 vector-length '#())
1022(test 8 vector-ref '#(1 1 2 3 5 8 13 21) 5)
1023(test '#(0 ("Sue" "Sue") "Anna") 'vector-set
1024 (let ((vec (vector 0 '(2 2 2 2) "Anna")))
1025 (vector-set! vec 1 '("Sue" "Sue"))
1026 vec))
1027(test '#(hi hi) make-vector 2 'hi)
1028(test '#() make-vector 0)
1029(test '#() make-vector 0 'a)
1030(SECTION 6 9)
1031(test #t procedure? car)
1032;(test #f procedure? 'car)
1033(test #t procedure? (lambda (x) (* x x)))
1034(test #f procedure? '(lambda (x) (* x x)))
1035(test #t call-with-current-continuation procedure?)
1036(test 7 apply + (list 3 4))
1037(test 7 apply (lambda (a b) (+ a b)) (list 3 4))
1038(test 17 apply + 10 (list 3 4))
1039(test '() apply list '())
1040(define compose (lambda (f g) (lambda args (f (apply g args)))))
1041(test 30 (compose sqt *) 12 75)
1042
1043(test '(b e h) map cadr '((a b) (d e) (g h)))
1044(test '(5 7 9) map + '(1 2 3) '(4 5 6))
1045(test '(1 2 3) map + '(1 2 3))
1046(test '(1 2 3) map * '(1 2 3))
1047(test '(-1 -2 -3) map - '(1 2 3))
1048(test '#(0 1 4 9 16) 'for-each
1049 (let ((v (make-vector 5)))
1050 (for-each (lambda (i) (vector-set! v i (* i i)))
1051 '(0 1 2 3 4))
1052 v))
1053(test -3 call-with-current-continuation
1054 (lambda (exit)
1055 (for-each (lambda (x) (if (negative? x) (exit x)))
1056 '(54 0 37 -3 245 19))
1057 #t))
1058(define list-length
1059 (lambda (obj)
1060 (call-with-current-continuation
1061 (lambda (return)
1062 (letrec ((r (lambda (obj) (cond ((null? obj) 0)
1063 ((pair? obj) (+ (r (cdr obj)) 1))
1064 (else (return #f))))))
1065 (r obj))))))
1066(test 4 list-length '(1 2 3 4))
1067(test #f list-length '(a b . c))
1068(test '() map cadr '())
1069
1070;;; This tests full conformance of call-with-current-continuation. It
1071;;; is a separate test because some schemes do not support call/cc
1072;;; other than escape procedures. I am indebted to
1073;;; raja@copper.ucs.indiana.edu (Raja Sooriamurthi) for fixing this
1074;;; code. The function leaf-eq? compares the leaves of 2 arbitrary
1075;;; trees constructed of conses.
1076(define (next-leaf-generator obj eot)
1077 (letrec ((return #f)
1078 (cont (lambda (x)
1079 (recur obj)
1080 (set! cont (lambda (x) (return eot)))
1081 (cont #f)))
1082 (recur (lambda (obj)
1083 (if (pair? obj)
1084 (for-each recur obj)
1085 (call-with-current-continuation
1086 (lambda (c)
1087 (set! cont c)
1088 (return obj)))))))
1089 (lambda () (call-with-current-continuation
1090 (lambda (ret) (set! return ret) (cont #f))))))
1091(define (leaf-eq? x y)
1092 (let* ((eot (list 'eot))
1093 (xf (next-leaf-generator x eot))
1094 (yf (next-leaf-generator y eot)))
1095 (letrec ((loop (lambda (x y)
1096 (cond ((not (eq? x y)) #f)
1097 ((eq? eot x) #t)
1098 (else (loop (xf) (yf)))))))
1099 (loop (xf) (yf)))))
1100(define (test-cont)
1101 (newline)
1102 (display ";testing continuations; ")
1103 (newline)
1104 (SECTION 6 9)
1105 (test #t leaf-eq? '(a (b (c))) '((a) b c))
1106 (test #f leaf-eq? '(a (b (c))) '((a) b c d))
1107 (report-errs))
1108
1109;;; Test Optional R4RS DELAY syntax and FORCE procedure
1110(define (test-delay)
1111 (newline)
1112 (display ";testing DELAY and FORCE; ")
1113 (newline)
1114 (SECTION 6 9)
1115 (test 3 'delay (force (delay (+ 1 2))))
1116 (test '(3 3) 'delay (let ((p (delay (+ 1 2))))
1117 (list (force p) (force p))))
1118 (test 2 'delay (letrec ((a-stream
1119 (letrec ((next (lambda (n)
1120 (cons n (delay (next (+ n 1)))))))
1121 (next 0)))
1122 (head car)
1123 (tail (lambda (stream) (force (cdr stream)))))
1124 (head (tail (tail a-stream)))))
1125 (letrec ((count 0)
1126 (p (delay (begin (set! count (+ count 1))
1127 (if (> count x)
1128 count
1129 (force p)))))
1130 (x 5))
1131 (test 6 force p)
1132 (set! x 10)
1133 (test 6 force p))
1134 (test 3 'force
1135 (letrec ((p (delay (if c 3 (begin (set! c #t) (+ (force p) 1)))))
1136 (c #f))
1137 (force p)))
1138 (report-errs))
1139
1140(SECTION 6 10 1)
1141(test #t input-port? (current-input-port))
1142(test #t output-port? (current-output-port))
1143(test #t call-with-input-file "r4rstest.scm" input-port?)
1144(define this-file (open-input-file "r4rstest.scm"))
1145(test #t input-port? this-file)
1146(SECTION 6 10 2)
1147(test #\; peek-char this-file)
1148(test #\; read-char this-file)
1149(test '(define cur-section '()) read this-file)
1150(test #\( peek-char this-file)
1151(test '(define errs '()) read this-file)
1152(close-input-port this-file)
1153(close-input-port this-file)
1154(define (check-test-file name)
1155 (define test-file (open-input-file name))
1156 (test #t 'input-port?
1157 (call-with-input-file
1158 name
1159 (lambda (test-file)
1160 (test load-test-obj read test-file)
1161 (test #t eof-object? (peek-char test-file))
1162 (test #t eof-object? (read-char test-file))
1163 (input-port? test-file))))
1164 (test #\; read-char test-file)
1165 (test #\; read-char test-file)
1166 (test #\; read-char test-file)
1167 (test write-test-obj read test-file)
1168 (test load-test-obj read test-file)
1169 (close-input-port test-file))
1170(SECTION 6 10 3)
1171(define write-test-obj
1172 '(#t #f a () 9739 -3 . #((test) "te \" \" st" "" test #() b c)))
1173(define load-test-obj
1174 (list 'define 'foo (list 'quote write-test-obj)))
1175(test #t call-with-output-file
1176 "tmp1.out"
1177 (lambda (test-file)
1178 (write-char #\; test-file)
1179 (display #\; test-file)
1180 (display ";" test-file)
1181 (write write-test-obj test-file)
1182 (newline test-file)
1183 (write load-test-obj test-file)
1184 (output-port? test-file)))
1185(check-test-file "tmp1.out")
1186
1187(define test-file (open-output-file "tmp2.out"))
1188(write-char #\; test-file)
1189(display #\; test-file)
1190(display ";" test-file)
1191(write write-test-obj test-file)
1192(newline test-file)
1193(write load-test-obj test-file)
1194(test #t output-port? test-file)
1195(close-output-port test-file)
1196(check-test-file "tmp2.out")
1197(define (test-sc4)
1198 (newline)
1199 (display ";testing scheme 4 functions; ")
1200 (newline)
1201 (SECTION 6 7)
1202 (test '(#\P #\space #\l) string->list "P l")
1203 (test '() string->list "")
1204 (test "1\\\"" list->string '(#\1 #\\ #\"))
1205 (test "" list->string '())
1206 (SECTION 6 8)
1207 (test '(dah dah didah) vector->list '#(dah dah didah))
1208 (test '() vector->list '#())
1209 (test '#(dididit dah) list->vector '(dididit dah))
1210 (test '#() list->vector '())
1211 (SECTION 6 10 4)
1212 (load "tmp1.out")
1213 (test write-test-obj 'load foo)
1214 (report-errs))
1215
1216(report-errs)
1217(let ((have-inexacts?
1218 (and (string->number "0.0") (inexact? (string->number "0.0"))))
1219 (have-bignums?
1220 (let ((n (string->number "281474976710655325431")))
1221 (and n (exact? n)))))
1222 (cond (have-inexacts?
1223 (test-inexact)
1224 #;(test-inexact-printing)))
1225 (if have-bignums? (test-bignum))
1226 (if (and have-inexacts? have-bignums?)
1227 (test-numeric-predicates)))
1228
1229(newline)
1230(display "To fully test continuations, Scheme 4, and DELAY/FORCE do:")
1231(newline)
1232(display "(test-cont) (test-sc4) (test-delay)")
1233(newline)
1234(test-cont)
1235(test-sc4)
1236(test-delay)
1237"last item in file"