feat: 9.5.9
This commit is contained in:
parent
cb1753732b
commit
35f43a7909
1084 changed files with 558985 additions and 0 deletions
926
nanopass/tests/alltests.ss
Normal file
926
nanopass/tests/alltests.ss
Normal file
|
@ -0,0 +1,926 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests alltests)
|
||||
(export main-tests final-tests)
|
||||
(import (rnrs))
|
||||
|
||||
(define main-tests
|
||||
'(
|
||||
'()
|
||||
(- 2 4)
|
||||
(* -6 7)
|
||||
(cons 0 '())
|
||||
(cons (cons 0 '()) (cons 1 '()))
|
||||
(void)
|
||||
(if #f 3)
|
||||
(let ((x 0)) x)
|
||||
(let ([x 0]) x x)
|
||||
(let ([q (add1 (add1 2))]) q)
|
||||
(+ 20 (if #t 122))
|
||||
(if #t
|
||||
(+ 20
|
||||
(if #t 122))
|
||||
10000)
|
||||
(not (if #f #t (not #f)))
|
||||
(let ([x 0][y 4000]) x)
|
||||
(begin (if #f 7) 3)
|
||||
(begin (if (zero? 4) 7) 3)
|
||||
(let ([x 0]) (begin (if (zero? x) 7) x))
|
||||
(let ([x 0]) (begin (if (zero? x) (begin x 7)) x))
|
||||
(let ([x 0] [z 9000])
|
||||
(begin (if (zero? x) (begin x 7)) z))
|
||||
(let ([x 0] [z 9000])
|
||||
(begin (if (zero? x) (begin (set! x x) 7))
|
||||
(+ x z)))
|
||||
(let ([x (cons 0 '())])
|
||||
(begin (if x (set-car! x (car x))) x))
|
||||
(let ([x (cons 0 '())])
|
||||
(begin (if x (set-car! x (+ (car x) (car x)))) x))
|
||||
(let ([x (cons 0 '())])
|
||||
(if (zero? (car x)) (begin (set-car! x x) 7) x))
|
||||
(let ([x (cons 0 '())])
|
||||
(let ([q x]) (if (zero? (car x)) (begin (set-car! q x) 7) x)))
|
||||
(let ([x 0]) (if (zero? x) (begin (set! x (+ x 5000)) x) 20))
|
||||
(let ([y 0]) (begin (if #t (set! y y)) y))
|
||||
(begin (if #t #t #t) #f)
|
||||
(begin (if (if #t #t #f) (if #t #t #f) (if #t #t #f)) #f)
|
||||
(let ([x 0] [y 4000] [z 9000])
|
||||
(let ((q (+ x z)))
|
||||
(begin
|
||||
(if (zero? x) (begin (set! q (+ x x)) 7))
|
||||
(+ y y)
|
||||
(+ x z))))
|
||||
(let ([x (let ([y 2]) y)] [y 5])
|
||||
(add1 x))
|
||||
(let ([y 4000]) (+ y y))
|
||||
((lambda (y) y) 4000)
|
||||
(let ([f (lambda (x) x)])
|
||||
(add1 (f 0)))
|
||||
(let ([f (lambda (y) y)]) (f (f 4)))
|
||||
((lambda (f) (f (f 4))) (lambda (y) y))
|
||||
((let ([a 4000])
|
||||
(lambda (b) (+ a b)))
|
||||
5000)
|
||||
(((lambda (a)
|
||||
(lambda (b)
|
||||
(+ a b)))
|
||||
4000)
|
||||
5000)
|
||||
(let ([f (lambda (x) (add1 x))]) (f (f 0)))
|
||||
((lambda (f) (f (f 0))) (lambda (x) (add1 x)))
|
||||
(let ([x 0] [f (lambda (x) x)])
|
||||
(let ([a (f x)] [b (f x)] [c (f x)]) (+ (+ a b) c)))
|
||||
(let ([x 0][y 1][z 2][f (lambda (x) x)])
|
||||
(let ([a (f x)][b (f y)][c (f z)])
|
||||
(+ (+ a b) c)))
|
||||
(let ([f (lambda (x y) x)])
|
||||
(f 0 1))
|
||||
(let ([f (lambda (x y) x)])
|
||||
(let ([a (f 0 1)]) (f a a)))
|
||||
(let ([x 0] [y 1] [z 2] [f (lambda (x y z) x)])
|
||||
(let ([a (f x y z)]) (f a a a)))
|
||||
(let ([x 0] [y 1] [z 2] [f (lambda (x y z) x)])
|
||||
(let ([a (f x y z)] [b y] [c z]) (f a b c)))
|
||||
(let ([f (lambda (a b c d)
|
||||
(+ a d))])
|
||||
(f 0 1 2 3))
|
||||
(let ([f (lambda (x) x)])
|
||||
(+ (f 0)
|
||||
(let ([a 0] [b 1] [c 2])
|
||||
(+ (f a) (+ (f b) (f c))))))
|
||||
(let ([f (lambda (x) x)])
|
||||
(+ (f 0)
|
||||
(let ([a 0] [b 1] [c 2])
|
||||
(add1 (f a)))))
|
||||
(let ([f (lambda (x) x)])
|
||||
(+ (f 0) (let ([a 0][b 1][c 2][d 3])
|
||||
(+ (f a)
|
||||
(+ (f b)
|
||||
(+ (f c)
|
||||
(f d)))))))
|
||||
(let ([a 0])(letrec ([a (lambda () 0)][b (lambda () 11)]) (set! a 11)))
|
||||
(let ([a 0])(letrec ([a (lambda () (set! a 0))][b 11]) (a)))
|
||||
(let ([a 0])(let ([a (set! a 0)][b 11]) a))
|
||||
(let ([a 5]) (let ([a 0] [b (set! a (+ a 11))]) a))
|
||||
(letrec ([a (lambda () 0)]) (a))
|
||||
(letrec ([a (lambda () 0)] [b (lambda () 11)]) (a))
|
||||
(let ([x 0]) (letrec ([a (lambda () 0)] [b (lambda () 11)]) (set! x 11)))
|
||||
(let ([a 0]) (let ([b (set! a 0)]) a))
|
||||
(let ([a 0])(let ([a (set! a 0)]) (let ([b 11]) a)))
|
||||
(let ([a 0])(let ([a 0]) (let ([b (set! a 11)]) a)))
|
||||
(let ([a 0])(let ([a 0]) (let ([b 11]) (set! a 11))))
|
||||
(let ([f (let ([x 1]) (lambda (y) (+ x y)))])
|
||||
(let ([x 0]) (f (f x))))
|
||||
((let ([t (lambda (x) (+ x 50))])
|
||||
(lambda (f) (t (f 1000))))
|
||||
(lambda (y) (+ y 2000)))
|
||||
(let ([x 0])
|
||||
(let ([f (let ([x 1] [z x])
|
||||
(lambda (y)
|
||||
(+ x (+ z y))))])
|
||||
(f (f x))))
|
||||
(((lambda (t)
|
||||
(lambda (f) (t (f 1000))))
|
||||
(lambda (x) (+ x 50)))
|
||||
(lambda (y) (+ y 2000)))
|
||||
((let ([t 50])
|
||||
(lambda (f)
|
||||
(+ t (f))))
|
||||
(lambda () 2000))
|
||||
(((lambda (t)
|
||||
(lambda (f)
|
||||
(+ t (f))))
|
||||
50)
|
||||
(lambda () 2000))
|
||||
((let ([x 300])
|
||||
(lambda (y) (+ x y)))
|
||||
400)
|
||||
(let ([x 3] [f (lambda (x y) x)])
|
||||
(f (f 0 0) x))
|
||||
(let ([x 3] [f (lambda (x y) x)])
|
||||
(if (f 0 0) (f (f 0 0) x) 0))
|
||||
(let ([x02 3] [f01 (lambda (x04 y03) x04)])
|
||||
(if (not x02) (f01 (f01 0 0) x02) 0))
|
||||
(let ((f (lambda (x) (if (if (pair? x) (not (eq? (car x) 0)) #f) x #f))))
|
||||
(f (cons 0 0)))
|
||||
(let ((f (lambda (x)
|
||||
(if (if x (not (if (pair? x) (not (eq? (car x) 0)) #f)) #f)
|
||||
x #f))))
|
||||
(f 0))
|
||||
(let ((f (lambda (x) (if (if (pair? x) #t (null? x)) x '()))))
|
||||
(f 0))
|
||||
(let ([y 4])
|
||||
(let ([f (lambda (y) y)])
|
||||
(f (f y))))
|
||||
(let ([y 4])
|
||||
(let ([f (lambda (x y) 0)])
|
||||
(f (f y y) (f y y))))
|
||||
(let ([y 4])
|
||||
(let ([f (lambda (x y) 0)])
|
||||
(f (f y y) (f y (f y y)))))
|
||||
(let ([y 4])
|
||||
(let ([f (lambda (x y) 0)])
|
||||
(f (f y (f y y)) (f y (f y y)))))
|
||||
((lambda (y) ((lambda (f) (f (f y))) (lambda (y) y))) 4)
|
||||
(let ([f (lambda (x) (+ x x))]) (f 4000))
|
||||
(let ((x (if 1000 2000 3000))) x)
|
||||
(let ([f (lambda (x) x)]) (add1 (if #f 1 (f 22))))
|
||||
(let ([f (lambda (x) x)]) (if (f (zero? 23)) 1 22))
|
||||
(let ([f (lambda (x) (if x (not x) x))]
|
||||
[f2 (lambda (x) (* 10 x))]
|
||||
[x 23])
|
||||
(add1 (if (f (zero? x)) 1 (* x (f2 (sub1 x))))))
|
||||
(let ([f (lambda () 0)])
|
||||
(let ([x (f)]) 1))
|
||||
(let ([f (lambda () 0)])
|
||||
(begin (f) 1))
|
||||
(let ([f (lambda (x) x)])
|
||||
(if #t (begin (f 3) 4) 5))
|
||||
(let ([f (lambda (x) x)])
|
||||
(begin (if #t (f 4) 5) 6))
|
||||
(let ([f (lambda (x) x)])
|
||||
(begin (if (f #t)
|
||||
(begin (f 3) (f 4))
|
||||
(f 5))
|
||||
(f 6)))
|
||||
(let ([f (lambda (x) (add1 x))])
|
||||
(f (let ([f 3]) (+ f 1))))
|
||||
(let ((x 15)
|
||||
(f (lambda (h v) (* h v)))
|
||||
(k (lambda (x) (+ x 5)))
|
||||
(g (lambda (x) (add1 x))))
|
||||
(k (g (let ((g 3)) (f g x)))))
|
||||
(let ([x 4])
|
||||
(let ([f (lambda () x)])
|
||||
(set! x 5)
|
||||
(f)))
|
||||
(let ([x (let ([y 2]) y)]) x)
|
||||
(let ([x (if #t (let ([y 2]) y) 1)]) x)
|
||||
(let ([x (let ([y (let ([z 3]) z)]) y)]) x)
|
||||
(let ([x (if #t (let ([y (if #t (let ([z 3]) z) 2)]) y) 1)]) x)
|
||||
(+ (let ([x 3]) (add1 x)) 4)
|
||||
(+ (let ([x 3][y 4]) (* x y)) 4)
|
||||
(let ([x (add1 (let ([y 4]) y))]) x)
|
||||
(let ([x (add1 (letrec ([y (lambda () 4)]) (y)))]) x)
|
||||
(let ([x (+ (let ([y 4]) y) (let ([y 4]) y))]) (add1 x))
|
||||
(let ([z 0]) (let ([x z]) z x))
|
||||
(let ([z 0]) (let ([x (begin (let ([y 2]) (set! z y)) z)]) x))
|
||||
(let ([x (begin (let ([y 2]) (set! y y)) (let ([z 3]) z))]) x)
|
||||
(letrec ([one (lambda (n) (if (zero? n) 1 (one (sub1 n))))])
|
||||
(one 13))
|
||||
(letrec ((even (lambda (x) (if (zero? x) #t (odd (sub1 x)))))
|
||||
(odd (lambda (x) (if (zero? x) #f (even (sub1 x))))))
|
||||
(odd 13))
|
||||
(let ([t #t] [f #f])
|
||||
(letrec ((even (lambda (x) (if (zero? x) t (odd (sub1 x)))))
|
||||
(odd (lambda (x) (if (zero? x) f (even (sub1 x))))))
|
||||
(odd 13)))
|
||||
(let ((even (lambda (x) x)))
|
||||
(even (letrec ((even (lambda (x) (if (zero? x) #t (odd (sub1 x)))))
|
||||
(odd (lambda (x) (if (zero? x) #f (even (sub1 x))))))
|
||||
(odd 13))))
|
||||
(letrec ((fact (lambda (n) (if (zero? n) 1 (* n (fact (sub1 n)))))))
|
||||
(fact 5))
|
||||
(let ([x 5])
|
||||
(letrec ([a (lambda (u v w) (if (zero? u) (b v w) (a (- u 1) v w)))]
|
||||
[b (lambda (q r)
|
||||
(let ([p (* q r)])
|
||||
(letrec
|
||||
([e (lambda (n) (if (zero? n) (c p) (o (- n 1))))]
|
||||
[o (lambda (n) (if (zero? n) (c x) (e (- n 1))))])
|
||||
(e (* q r)))))]
|
||||
[c (lambda (x) (* 5 x))])
|
||||
(a 3 2 1)))
|
||||
(let ([f (lambda () 80)]) (let ([a (f)] [b (f)]) 0))
|
||||
(let ([f (lambda () 80)]) (let ([a (f)] [b (f)]) (* a b)))
|
||||
(let ([f (lambda () 80)] [g (lambda () 80)])
|
||||
(let ([a (f)] [b (g)])
|
||||
(* a b)))
|
||||
(let ((f (lambda (x) (add1 x)))
|
||||
(g (lambda (x) (sub1 x)))
|
||||
(t (lambda (x) (add1 x)))
|
||||
(j (lambda (x) (add1 x)))
|
||||
(i (lambda (x) (add1 x)))
|
||||
(h (lambda (x) (add1 x)))
|
||||
(x 80))
|
||||
(let ((a (f x)) (b (g x)) (c (h (i (j (t x))))))
|
||||
(* a (* b (+ c 0)))))
|
||||
(let ((x 3000))
|
||||
(if (integer? x)
|
||||
(let ((y (cons x '())))
|
||||
(if (if (pair? y) (null? (cdr y)) #f)
|
||||
(+ x 5000)
|
||||
(- x 3000)))))
|
||||
(let ((x (cons 1000 2000)))
|
||||
(if (pair? x)
|
||||
(let ((temp (car x)))
|
||||
(set-car! x (cdr x))
|
||||
(set-cdr! x temp)
|
||||
(+ (car x) (cdr x)))
|
||||
10000000))
|
||||
(let ((v (make-vector 3)))
|
||||
(vector-set! v 0 10)
|
||||
(vector-set! v 1 20)
|
||||
(vector-set! v 2 30)
|
||||
(if (vector? v)
|
||||
(+ (+ (vector-length v) (vector-ref v 0))
|
||||
(+ (vector-ref v 1) (vector-ref v 2)))
|
||||
10000))
|
||||
(let ([fact (lambda (fact n)
|
||||
(if (zero? n) 1 (* (fact fact (sub1 n)) n)))])
|
||||
(fact fact 5))
|
||||
(let ([s (make-vector 20)])
|
||||
(vector-set! s 19 #\z)
|
||||
(if (vector? s)
|
||||
(+ 20 (let ([c #\z]) (if (char? c) 122)))
|
||||
10000))
|
||||
(let ([s (make-vector 20)])
|
||||
(vector-set! s 19 #\z)
|
||||
(if (vector? s)
|
||||
(+ (vector-length s)
|
||||
(let ([c (vector-ref s 19)])
|
||||
(if (char? c)
|
||||
(char->integer (vector-ref s 19)))))
|
||||
10000))
|
||||
(let ((s (make-vector 20)) (s2 (make-vector 3)))
|
||||
(vector-set! s 19 #\z)
|
||||
(vector-set! s 18 #\t)
|
||||
(vector-set! s2 0 #\a)
|
||||
(if (vector? s)
|
||||
(+ (vector-length s)
|
||||
(let ((c (vector-ref s 18)))
|
||||
(if (char? c)
|
||||
(+ (char->integer (vector-ref s 19))
|
||||
(char->integer c)))))
|
||||
10000))
|
||||
(let ([f (lambda (x) (+ x 1000))])
|
||||
(if (zero? (f -2)) (f 6000) (f (f 8000))))
|
||||
(let ([f (lambda (x) (+ x 1000))])
|
||||
(if (zero? (f -1)) (f 6000) (f (f 8000))))
|
||||
(let ((f (lambda (x y) (+ x 1000))))
|
||||
(+ (if (f 3000 (begin 0 0 0)) (f (f 4000 0) 0) 8000) 2000))
|
||||
((((lambda (x)
|
||||
(lambda (y)
|
||||
(lambda (z)
|
||||
(+ x (+ y (+ z y))))))
|
||||
5) 6) 7)
|
||||
((((((lambda (x)
|
||||
(lambda (y)
|
||||
(lambda (z)
|
||||
(lambda (w)
|
||||
(lambda (u)
|
||||
(+ x (+ y (+ z (+ w u)))))))))
|
||||
5) 6) 7) 8) 9)
|
||||
(let ((f (lambda (x) x)))
|
||||
(if (procedure? f) #t #f))
|
||||
(let ((sum (lambda (sum ls)
|
||||
(if (null? ls) 0 (+ (car ls) (sum sum (cdr ls)))))))
|
||||
(sum sum (cons 1 (cons 2 (cons 3 '())))))
|
||||
(let ((v (make-vector 5))
|
||||
(w (make-vector 7)))
|
||||
(vector-set! v 0 #t)
|
||||
(vector-set! w 3 #t)
|
||||
(if (boolean? (vector-ref v 0))
|
||||
(vector-ref w 3)
|
||||
#f))
|
||||
(let ((a 5) (b 4))
|
||||
(if (< b 3)
|
||||
(eq? a (+ b 1))
|
||||
(if (<= b 3)
|
||||
(eq? (- a 1) b)
|
||||
(= a (+ b 2)))))
|
||||
(let ((a 5) (b 4))
|
||||
(if #f (eq? a (+ b 1)) (if #f (eq? (- a 1) b) (= a (+ b 2)))))
|
||||
(((lambda (a) (lambda () (+ a (if #t 200)) 1500)) 1000))
|
||||
(((lambda (b) (lambda (a) (set! a (if 1 2)) (+ a b))) 100) 200)
|
||||
((((lambda (a)
|
||||
(lambda (b)
|
||||
(set! a (if b 200))
|
||||
(lambda (c) (set! c (if 300 400))
|
||||
(+ a (+ b c)))))
|
||||
1000) 2000) 3000)
|
||||
((((lambda (a) (lambda (b) (lambda (c) (+ a (+ b c))))) 10) 20) 30)
|
||||
(+ 2 3)
|
||||
((lambda (a) (+ 2 a)) 3)
|
||||
(((lambda (b) (lambda (a) (+ b a))) 3) 2)
|
||||
((lambda (b) ((lambda (a) (+ b a)) 2)) 3)
|
||||
((lambda (f) (f (f 5))) (lambda (x) x))
|
||||
((let ((f (lambda (x) (+ x 3000)))) (lambda (y) (f (f y)))) 2000)
|
||||
(let ((n #\newline) (s #\space) (t #\tab))
|
||||
(let ((st (make-vector 5)))
|
||||
(vector-set! st 0 n)
|
||||
(vector-set! st 1 s)
|
||||
(vector-set! st 2 t)
|
||||
(if (not (vector? st))
|
||||
10000
|
||||
(vector-length st))))
|
||||
(let ((s (make-vector 1)))
|
||||
(vector-set! s 0 #\c)
|
||||
(if (eq? (vector-ref s 0) #\c) 1000 2000))
|
||||
(not 17)
|
||||
(not #f)
|
||||
(let ([fact (lambda (fact n acc)
|
||||
(if (zero? n) acc (fact fact (sub1 n) (* n acc))))])
|
||||
(fact fact 5 1))
|
||||
((lambda (b c a)
|
||||
(let ((b (+ b a)) (a (+ a (let ((a (+ b b)) (c (+ c c))) (+ a a)))))
|
||||
(* a a))) 2 3 4)
|
||||
(let ((f (lambda (x) (lambda () (x))))) ((f (lambda () 3))))
|
||||
(letrec ((f (lambda (x) (if (zero? x) 1 (* x (f (- x 1)))))))
|
||||
(let ([q 17])
|
||||
(let ((g (lambda (a) (set! q 10) (lambda () (a q)))))
|
||||
((g f)))))
|
||||
(letrec ((f (lambda (x) (if (zero? x) 1 (* x (f (- x 1)))))))
|
||||
(let ((g (lambda (a) (lambda (b) (a b)))))
|
||||
((g f) 10)))
|
||||
(letrec ((f (lambda () (+ a b)))
|
||||
(g (lambda (y) (set! g (lambda (y) y)) (+ y y)))
|
||||
(a 17)
|
||||
(b 35)
|
||||
(h (cons (lambda () a) (lambda (v) (set! a v)))))
|
||||
(let ((x1 (f)) (x2 (g 22)) (x3 ((car h))))
|
||||
(let ((x4 (g 22)))
|
||||
((cdr h) 3)
|
||||
(let ((x5 (f)) (x6 ((car h))))
|
||||
(cons x1 (cons x2 (cons x3 (cons x4 (cons x5 x6)))))))))
|
||||
(letrec ((f (lambda () (+ a b)))
|
||||
(a 17)
|
||||
(b 35)
|
||||
(h (cons (lambda () a) (lambda () b))))
|
||||
(cons (f) (cons a (cons b (cons ((car h)) ((cdr h)))))))
|
||||
(letrec ((f (lambda (x) (letrec ((x 3)) 3))))
|
||||
(letrec ((g (lambda (x) (letrec ((y 14)) (set! y 7) y))))
|
||||
(set! g (cons g 3))
|
||||
(letrec ((h (lambda (x) x)) (z 42))
|
||||
(cons (cdr g) (h z)))))
|
||||
(let ([t #t] [f #f])
|
||||
(let ([bools (cons t f)] [id (lambda (x) (if (not x) f t))])
|
||||
(letrec
|
||||
([even (lambda (x) (if (zero? x) (id (car bools)) (odd (- x 1))))]
|
||||
[odd (lambda (y) (if (zero? y) (id (cdr bools)) (even (- y 1))))])
|
||||
(odd 5))))
|
||||
(letrec ([fib (lambda (x)
|
||||
(let ([decrx (lambda () (set! x (- x 1)))])
|
||||
(if (< x 2)
|
||||
1
|
||||
(+ (begin (decrx) (fib x))
|
||||
(begin (decrx) (fib x))))))])
|
||||
(fib 10))
|
||||
(letrec ([fib (lambda (x)
|
||||
(let ([decrx (lambda () (lambda (i) (set! x (- x i))))])
|
||||
(if (< x 2)
|
||||
1
|
||||
(+ (begin ((decrx) 1) (fib x))
|
||||
(begin ((decrx) 1) (fib x))))))])
|
||||
(fib 10))
|
||||
;; Jie Li
|
||||
(let ((a 5))
|
||||
(let ((b (cons a 6)))
|
||||
(let ((f (lambda(x) (* x a))))
|
||||
(begin (if (- (f a) (car b))
|
||||
(begin (set-car! b (if (not a) (* 2 a) (+ 2 a)))
|
||||
(f a))
|
||||
(if (not (not (< (f a) b))) (f a)))
|
||||
(not 3)
|
||||
(void)
|
||||
(f (car b))))))
|
||||
(letrec ([f (lambda (x y)
|
||||
(if (not x) (g (add1 x) (add1 y)) (h (+ x y))))]
|
||||
[g (lambda (u v)
|
||||
(let ([a (+ u v)] [b (* u v)])
|
||||
(letrec ([e (lambda (d)
|
||||
(letrec ([p (cons a b)]
|
||||
[q (lambda (m)
|
||||
(if (< m u)
|
||||
(f m d)
|
||||
(h (car p))))])
|
||||
(q (f a b))))])
|
||||
(e u))))]
|
||||
[h (lambda (w) w)])
|
||||
(f 4 5))
|
||||
(letrec ((f (lambda (x)
|
||||
(+ x (((lambda (y)
|
||||
(lambda (z)
|
||||
(+ y z)))
|
||||
6) 7))))
|
||||
(g (+ 5 ((lambda (w u) (+ w u)) 8 9))))
|
||||
g)
|
||||
;; Jordan Johnson
|
||||
(let ((test (if (not (not 10)) #f 5)))
|
||||
(letrec ([num 5]
|
||||
[length
|
||||
(lambda (ls)
|
||||
(let ((len (if ((lambda (ck)
|
||||
(begin ck (set! num test) ck))
|
||||
(null? ls))
|
||||
(begin num (set! num 0) num)
|
||||
(begin (length '())
|
||||
(set! num 5)
|
||||
(+ 1 (length (cdr ls)))))))
|
||||
(if len len)))])
|
||||
(length (cons 5 (cons (if (set! num 50) (length (cons test '())) 1)
|
||||
'())))))
|
||||
(letrec ([quotient (lambda (x y)
|
||||
(if (< x 0)
|
||||
(- 0 (quotient (- 0 x) y))
|
||||
(if (< y 0)
|
||||
(- 0 (quotient x (- 0 y)))
|
||||
(letrec ([f (lambda (x a)
|
||||
(if (< x y)
|
||||
a
|
||||
(f (- x y) (+ a 1))))])
|
||||
(f x 0)))))])
|
||||
(letrec ([sub-interval 1]
|
||||
[sub-and-continue
|
||||
(lambda (n acc k) (k (- n sub-interval) (* n acc)))]
|
||||
[strange-fact
|
||||
(lambda (n acc)
|
||||
(if (zero? n)
|
||||
(lambda (proc) (proc acc))
|
||||
(sub-and-continue n acc strange-fact)))])
|
||||
(let ([x 20]
|
||||
[fact (let ((seed 1)) (lambda (n) (strange-fact n seed)))])
|
||||
(let ([give-fact5-answer (fact 5)]
|
||||
[give-fact6-answer (fact 6)]
|
||||
[answer-user (lambda (ans) (quotient ans x))])
|
||||
(set! x (give-fact5-answer answer-user))
|
||||
(begin (set! x (give-fact6-answer answer-user)) x)))))
|
||||
(let ((y '()) (z 10))
|
||||
(let ((test-ls (cons 5 y)))
|
||||
(set! y (lambda (f)
|
||||
((lambda (g) (f (lambda (x) ((g g) x))))
|
||||
(lambda (g) (f (lambda (x) ((g g) x)))))))
|
||||
(set! test-ls (cons z test-ls))
|
||||
(letrec ((length (lambda (ls)
|
||||
(if (null? ls) 0 (+ 1 (length (cdr ls)))))))
|
||||
(let ((len (length test-ls)))
|
||||
(eq? (begin
|
||||
(set! length (y (lambda (len)
|
||||
(lambda (ls)
|
||||
(if (null? ls)
|
||||
0
|
||||
(+ 1 (len (cdr ls))))))))
|
||||
(length test-ls))
|
||||
len)))))
|
||||
;; Ryan Newton
|
||||
(letrec ((loop (lambda () (lambda () (loop))))) (loop) 0)
|
||||
(letrec ([f (lambda ()
|
||||
(letrec ([loop
|
||||
(lambda (link)
|
||||
(lambda ()
|
||||
(link)))])
|
||||
(loop (lambda () 668))))])
|
||||
((f)))
|
||||
;; AWK - the following test uses the syntax #36rgood and #36rbad,
|
||||
;; which the ikarus reader seems to choak on, so I'm commenting out
|
||||
;; this test for now.
|
||||
; (if (lambda () 1)
|
||||
; (let ((a 2))
|
||||
; (if (if ((lambda (x)
|
||||
; (let ((x (set! a (set! a 1))))
|
||||
; x)) 1)
|
||||
; (if (eq? a (void))
|
||||
; #t
|
||||
; #f)
|
||||
; #f)
|
||||
; #36rgood ; dyb: cannot use symbols, so use radix 36
|
||||
; #36rbad))) ; syntax to make all letters digits
|
||||
|
||||
; contributed by Ryan Newton
|
||||
(letrec ([dropsearch
|
||||
(lambda (cell tree)
|
||||
(letrec ([create-link
|
||||
(lambda (node f)
|
||||
(lambda (g)
|
||||
(if (not (pair? node))
|
||||
(f g)
|
||||
(if (eq? node cell)
|
||||
#f
|
||||
(f (create-link
|
||||
(car node)
|
||||
(create-link
|
||||
(cdr node) g)))))))]
|
||||
[loop
|
||||
(lambda (link)
|
||||
(lambda ()
|
||||
(if link
|
||||
(loop (link (lambda (v) v)))
|
||||
#f)))])
|
||||
(loop (create-link tree (lambda (x) x)))))]
|
||||
[racethunks
|
||||
(lambda (thunkx thunky)
|
||||
(if (if thunkx thunky #f)
|
||||
(racethunks (thunkx) (thunky))
|
||||
(if thunky
|
||||
#t
|
||||
(if thunkx
|
||||
#f
|
||||
'()))))]
|
||||
[higher? (lambda (x y tree)
|
||||
(racethunks (dropsearch x tree)
|
||||
(dropsearch y tree)))]
|
||||
[under?
|
||||
(lambda (x y tree)
|
||||
(racethunks (dropsearch x y)
|
||||
(dropsearch x tree)))]
|
||||
[explore
|
||||
(lambda (x y tree)
|
||||
(if (not (pair? y))
|
||||
#t
|
||||
(if (eq? x y)
|
||||
#f ; takes out anything pointing to itself
|
||||
(let ((result (higher? x y tree)))
|
||||
(if (eq? result #t)
|
||||
(if (explore y (car y) tree)
|
||||
(explore y (cdr y) tree)
|
||||
#f)
|
||||
(if (eq? result #f)
|
||||
(process-vertical-jump x y tree)
|
||||
(if (eq? result '())
|
||||
(process-horizontal-jump x y tree)
|
||||
)))))))]
|
||||
[process-vertical-jump
|
||||
(lambda (jumpedfrom jumpedto tree)
|
||||
(if (under? jumpedfrom jumpedto tree)
|
||||
#f
|
||||
(fullfinite? jumpedto)))]
|
||||
[process-horizontal-jump
|
||||
(lambda (jumpedfrom jumpedto tree)
|
||||
(fullfinite? jumpedto))]
|
||||
[fullfinite?
|
||||
(lambda (pair)
|
||||
(if (not (pair? pair))
|
||||
#t
|
||||
(if (explore pair (car pair) pair)
|
||||
(explore pair (cdr pair) pair)
|
||||
#f)))])
|
||||
(cons (fullfinite? (cons 1 2))
|
||||
(cons (fullfinite? (let ((x (cons 1 2))) (set-car! x x) x))
|
||||
(cons (fullfinite?
|
||||
(let ([a (cons 0 0)] [b (cons 0 0)] [c (cons 0 0)])
|
||||
(set-car! a b) (set-cdr! a c) (set-cdr! b c)
|
||||
(set-car! b c) (set-car! c b) (set-cdr! c b) a))
|
||||
'()))))))
|
||||
|
||||
(define final-tests
|
||||
; extracted tests from assignment writeups
|
||||
'(75
|
||||
(+ 16 32)
|
||||
(* 16 128)
|
||||
(let ((x 16) (y 128)) (* x y))
|
||||
(let ([x 17]) (+ x x)) (cons 16 32) (cdr (cons 16 32))
|
||||
(let ((x (cons 16 32))) (pair? x))
|
||||
(let ([x 3]) (let ([y (+ x (quote 4))]) (+ x y)))
|
||||
(let ([f (lambda (x) x)]) (let ([a 1]) (* (+ (f a) a) a)))
|
||||
(let ([k (lambda (x y) x)])
|
||||
(let ([b 17]) ((k (k k 37) 37) b (* b b))))
|
||||
(let ([f (lambda ()
|
||||
(let ([n 256])
|
||||
(let ([v (make-vector n)])
|
||||
(vector-set! v 32 n)
|
||||
(vector-ref v 32))))])
|
||||
(pair? (f)))
|
||||
(let ((w 4) (x 8) (y 16) (z 32))
|
||||
(let ((f (lambda ()
|
||||
(+ w (+ x (+ y z))))))
|
||||
(f)))
|
||||
(let ((f (lambda (g u) (g (if u (g 37) u)))))
|
||||
(f (lambda (x) x) 75))
|
||||
(let ((f (lambda (h u) (h (if u (h (+ u 37)) u)))) (w 62))
|
||||
(f (lambda (x) (- w x)) (* 75 w)))
|
||||
(let ([t #t] [f #f])
|
||||
(let ([bools (cons t f)] [id (lambda (x) (if (not x) f t))])
|
||||
(letrec
|
||||
([even (lambda (x) (if (id (zero? x)) (car bools) (odd (- x 1))))]
|
||||
[odd (lambda (y) (if (zero? y) (id (cdr bools)) (even (- y 1))))])
|
||||
(odd 5))))
|
||||
((lambda (x y z)
|
||||
(let ((f (lambda (u v) (begin (set! x u) (+ x v))))
|
||||
(g (lambda (r s) (begin (set! y (+ z s)) y))))
|
||||
(* (f '1 '2) (g '3 '4))))
|
||||
'10 '11 '12)
|
||||
((lambda (x y z)
|
||||
(let ((f '#f)
|
||||
(g (lambda (r s) (begin (set! y (+ z s)) y))))
|
||||
(begin
|
||||
(set! f
|
||||
(lambda (u v) (begin (set! v u) (+ x v))))
|
||||
(* (f '1 '2) (g '3 '4)))))
|
||||
'10 '11 '12)
|
||||
(letrec ((f (lambda (x) (+ x 1)))
|
||||
(g (lambda (y) (f (f y)))))
|
||||
(+ (f 1) (g 1)))
|
||||
(let ((y 3))
|
||||
(letrec
|
||||
((f (lambda (x) (if (zero? x) (g (+ x 1)) (f (- x y)))))
|
||||
(g (lambda (x) (h (* x x))))
|
||||
(h (lambda (x) x)))
|
||||
(g 39)))
|
||||
(letrec ((f (lambda (x) (+ x 1))) (g (lambda (y) (f (f y)))))
|
||||
(set! f (lambda (x) (- x 1)))
|
||||
(+ (f 1) (g 1)))
|
||||
(letrec ([f (lambda () (+ a b))]
|
||||
[a 17]
|
||||
[b 35]
|
||||
[h (cons (lambda () a) (lambda () b))])
|
||||
(cons (f) (cons a (cons b (cons ((car h)) ((cdr h)))))))
|
||||
(let ((v (make-vector 8)))
|
||||
(vector-set! v 0 '())
|
||||
(vector-set! v 1 (void))
|
||||
(vector-set! v 2 #f)
|
||||
(vector-set! v 3 #\a)
|
||||
(vector-set! v 4 #\z)
|
||||
(vector-set! v 5 #t)
|
||||
(vector-set! v 6 2)
|
||||
(vector-set! v 7 5)
|
||||
(vector-ref v (vector-ref v 6)))
|
||||
(let ([x 5] [th (let ((a 1)) (lambda () a))])
|
||||
(letrec ([fact (lambda (n th)
|
||||
(if (zero? n) (th) (* n (fact (- n 1) th))))])
|
||||
(fact x th)))
|
||||
(let ([negative? (lambda (n) (< n 0))])
|
||||
(letrec
|
||||
([fact (lambda (n)
|
||||
(if (zero? n) 1 (* n (fact (- n 1)))))]
|
||||
[call-fact (lambda (n)
|
||||
(if (not (negative? n))
|
||||
(fact n)
|
||||
(- 0 (fact (- 0 n)))))])
|
||||
(cons (call-fact 5) (call-fact -5))))
|
||||
(letrec ([iota-fill! (lambda (v i n)
|
||||
(if (not (= i n))
|
||||
(begin
|
||||
(vector-set! v i i)
|
||||
(iota-fill! v (+ i 1) n))))])
|
||||
(let ([n 4])
|
||||
(let ([v (make-vector n)]) (iota-fill! v 0 n) v)))
|
||||
; make-vector with non-constant operand and improper alignment
|
||||
(let ([x 6])
|
||||
(let ([v (make-vector x)])
|
||||
(vector-set! v 0 3)
|
||||
(vector-set! v 1 (cons (vector-ref v 0) 2))
|
||||
(vector-set! v 2 (cons (vector-ref v 1) 2))
|
||||
(vector-set! v 3 (cons (vector-ref v 2) 2))
|
||||
(vector-set! v 4 (cons (vector-ref v 3) 2))
|
||||
(vector-set! v 5 (cons (vector-ref v 4) 2))
|
||||
(cons (pair? (vector-ref v 5)) (car (vector-ref v 4)))))
|
||||
; nest some lambdas
|
||||
(((((lambda (a)
|
||||
(lambda (b)
|
||||
(lambda (c)
|
||||
(lambda (d)
|
||||
(cons (cons a b) (cons c d))))))
|
||||
33) 55) 77) 99)
|
||||
; stress the register allocator
|
||||
(let ((a 17))
|
||||
(let ((f (lambda (x)
|
||||
(let ((x1 (+ x 1)) (x2 (+ x 2)))
|
||||
(let ((y1 (* x1 7)) (y2 (* x2 7)))
|
||||
(let ((z1 (- y1 x1)) (z2 (- y2 x2)))
|
||||
(let ((w1 (* z1 a)) (w2 (* z2 a)))
|
||||
(let ([g (lambda (b)
|
||||
(if (= b a)
|
||||
(cons x1 (cons y1 (cons z1 '())))
|
||||
(cons x2 (cons y2 (cons z2 '())))))]
|
||||
[h (lambda (c)
|
||||
(if (= c x) w1 w2))])
|
||||
(if (if (= (* x x) (+ x x))
|
||||
#t
|
||||
(< x 0))
|
||||
(cons (g 17) (g 16))
|
||||
(cons (h x) (h (- x 0))))))))))))
|
||||
(cons (f 2) (cons (f -1) (cons (f 3) '())))))
|
||||
; printer
|
||||
(letrec
|
||||
([write
|
||||
(lambda (x)
|
||||
(let ([digits
|
||||
(let ([v (make-vector 10)])
|
||||
(vector-set! v 0 #\0)
|
||||
(vector-set! v 1 #\1)
|
||||
(vector-set! v 2 #\2)
|
||||
(vector-set! v 3 #\3)
|
||||
(vector-set! v 4 #\4)
|
||||
(vector-set! v 5 #\5)
|
||||
(vector-set! v 6 #\6)
|
||||
(vector-set! v 7 #\7)
|
||||
(vector-set! v 8 #\8)
|
||||
(vector-set! v 9 #\9)
|
||||
v)])
|
||||
(letrec
|
||||
([list->vector
|
||||
(lambda (ls)
|
||||
(let ([v (make-vector (length ls))])
|
||||
(letrec
|
||||
([loop
|
||||
(lambda (ls i)
|
||||
(if (null? ls)
|
||||
v
|
||||
(begin
|
||||
(vector-set! v i (car ls))
|
||||
(loop (cdr ls) (+ i 1)))))])
|
||||
(loop ls 0))))]
|
||||
[length
|
||||
(lambda (ls)
|
||||
(if (null? ls)
|
||||
0
|
||||
(add1 (length (cdr ls)))))]
|
||||
[map
|
||||
(lambda (p ls)
|
||||
(if (null? ls)
|
||||
'()
|
||||
(cons (p (car ls))
|
||||
(map p (cdr ls)))))]
|
||||
[wr (lambda (x p)
|
||||
(if (eq? x #f)
|
||||
(cons #\# (cons #\f p))
|
||||
(if (eq? x #t)
|
||||
(cons #\# (cons #\t p))
|
||||
(if (eq? x '())
|
||||
(cons #\( (cons #\) p))
|
||||
(if (eq? x (void))
|
||||
(cons #\# (cons #\< (cons #\v
|
||||
(cons #\o (cons #\i (cons #\d
|
||||
(cons #\> p)))))))
|
||||
(if (char? x)
|
||||
(cons #\# (cons #\\
|
||||
(if (eq? x #\newline)
|
||||
(cons #\n (cons #\e (cons #\w
|
||||
(cons #\l (cons #\i (cons #\n
|
||||
(cons #\e p)))))))
|
||||
(if (eq? x #\space)
|
||||
(cons #\s (cons #\p
|
||||
(cons #\a (cons #\c
|
||||
(cons #\e p)))))
|
||||
(if (eq? x #\tab)
|
||||
(cons #\t (cons #\a
|
||||
(cons #\b p)))
|
||||
(cons x p))))))
|
||||
(if (integer? x)
|
||||
(if (< x 0)
|
||||
(cons #\- (wrint (- 0 x) p))
|
||||
(wrint x p))
|
||||
(if (pair? x)
|
||||
(cons #\( ; )
|
||||
(letrec
|
||||
([loop
|
||||
(lambda (x)
|
||||
(wr (car x)
|
||||
(if (pair? (cdr x))
|
||||
(cons #\space
|
||||
(loop
|
||||
(cdr x)))
|
||||
(if
|
||||
(null?
|
||||
(cdr x))
|
||||
;(
|
||||
(cons #\) p)
|
||||
(cons
|
||||
#\space
|
||||
(cons
|
||||
#\.
|
||||
(cons
|
||||
#\space
|
||||
(wr
|
||||
(cdr
|
||||
x)
|
||||
;(
|
||||
(cons
|
||||
#\)
|
||||
p)
|
||||
))))
|
||||
))))])
|
||||
(loop x)))
|
||||
(if (vector? x)
|
||||
(cons #\# (cons #\( ; )
|
||||
(let
|
||||
([n (vector-length
|
||||
x)])
|
||||
(if (= n 0) ;(
|
||||
(cons #\) p)
|
||||
(letrec
|
||||
([loop
|
||||
(lambda (i)
|
||||
(wr
|
||||
(vector-ref
|
||||
x i)
|
||||
(if
|
||||
(=
|
||||
(+
|
||||
i
|
||||
1)
|
||||
n)
|
||||
;(
|
||||
(cons
|
||||
#\)
|
||||
p)
|
||||
(cons
|
||||
#\space
|
||||
(loop
|
||||
(+
|
||||
i
|
||||
1))
|
||||
)))
|
||||
)])
|
||||
(loop 0))))))
|
||||
(if (procedure? x)
|
||||
(cons #\# (cons #\<
|
||||
(cons #\p (cons #\r
|
||||
(cons #\o
|
||||
(cons #\c
|
||||
(cons #\e
|
||||
(cons #\d
|
||||
(cons #\u
|
||||
(cons
|
||||
#\r
|
||||
(cons
|
||||
#\e
|
||||
(cons
|
||||
#\>
|
||||
p)
|
||||
)))
|
||||
))))))))
|
||||
(cons #\# (cons #\<
|
||||
(cons #\g (cons #\a
|
||||
(cons #\r
|
||||
(cons #\b
|
||||
(cons #\a
|
||||
(cons #\g
|
||||
(cons #\e
|
||||
(cons
|
||||
#\>
|
||||
p))))
|
||||
)))))))))
|
||||
)))))))]
|
||||
[wrint (lambda (n p)
|
||||
(if (< n 10)
|
||||
(cons (vector-ref digits n) p)
|
||||
(wrint
|
||||
(quotient n 10)
|
||||
(cons (vector-ref digits
|
||||
(remainder n 10)) p))))]
|
||||
[remainder (lambda (x y)
|
||||
(let ([q (quotient x y)]) (- x (* y q))))]
|
||||
[quotient (lambda (x y)
|
||||
(if (< x 0)
|
||||
(- 0 (quotient (- 0 x) y))
|
||||
(if (< y 0)
|
||||
(- 0 (quotient x (- 0 y)))
|
||||
(letrec ([f (lambda (x a)
|
||||
(if (< x y)
|
||||
a
|
||||
(f (- x y) (+ a 1))))])
|
||||
(f x 0)))))])
|
||||
(list->vector (map (lambda (x)
|
||||
(char->integer x))
|
||||
(wr x '()))))))])
|
||||
(write
|
||||
(let ([v1 (make-vector 4)] [v2 (make-vector 0)])
|
||||
(vector-set! v1 0 #\a)
|
||||
(vector-set! v1 1 #\space)
|
||||
(vector-set! v1 2 #\newline)
|
||||
(vector-set! v1 3 #\tab)
|
||||
(cons (cons 0 (cons 4 (cons 2334 -98765)))
|
||||
(cons (cons #t (cons #f (cons (void) (cons '() '()))))
|
||||
(cons v1 (cons v2 write))))))))))
|
63
nanopass/tests/compiler-test.ss
Normal file
63
nanopass/tests/compiler-test.ss
Normal file
|
@ -0,0 +1,63 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests compiler-test)
|
||||
(export test-one test-all run-main-tests run-final-tests run-all-tests)
|
||||
(import (rnrs)
|
||||
(tests compiler)
|
||||
(tests test-driver)
|
||||
(tests alltests))
|
||||
|
||||
(define run-final-tests
|
||||
(case-lambda
|
||||
[() (run-final-tests #t)]
|
||||
[(emit?) (run-final-tests emit? #f)]
|
||||
[(emit? noisy?) (tests final-tests) (test-all emit? noisy?)]))
|
||||
|
||||
(define run-main-tests
|
||||
(case-lambda
|
||||
[() (run-main-tests #t)]
|
||||
[(emit?) (run-main-tests emit? #f)]
|
||||
[(emit? noisy?) (tests main-tests) (test-all emit? noisy?)]))
|
||||
|
||||
(define run-all-tests
|
||||
(case-lambda
|
||||
[() (run-all-tests #t #f)]
|
||||
[(emit?) (run-all-tests emit? #f)]
|
||||
[(emit? noisy?) (run-main-tests emit? noisy?)
|
||||
(run-final-tests emit? noisy?)]))
|
||||
|
||||
(passes
|
||||
(define-passes
|
||||
rename-vars/verify-legal
|
||||
remove-implicit-begin
|
||||
remove-unquoted-constant
|
||||
remove-one-armed-if
|
||||
uncover-settable
|
||||
remove-impure-letrec
|
||||
remove-set!
|
||||
sanitize-binding
|
||||
remove-anonymous-lambda
|
||||
uncover-free
|
||||
convert-closure
|
||||
lift-letrec
|
||||
explicit-closure
|
||||
normalize-context
|
||||
remove-complex-opera*
|
||||
remove-anonymous-call
|
||||
introduce-dummy-rp
|
||||
remove-nonunary-let
|
||||
return-of-set!
|
||||
explicit-labels
|
||||
;unparse-l18
|
||||
;introduce-registers
|
||||
;uncover-live
|
||||
;uncover-conflict
|
||||
;uncover-move
|
||||
;assign-register
|
||||
;rename-register
|
||||
;assign-frame
|
||||
;rename-frame
|
||||
;flatten-program
|
||||
;generate-code
|
||||
)))
|
1456
nanopass/tests/compiler.ss
Normal file
1456
nanopass/tests/compiler.ss
Normal file
File diff suppressed because it is too large
Load diff
325
nanopass/tests/helpers.ss
Normal file
325
nanopass/tests/helpers.ss
Normal file
|
@ -0,0 +1,325 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests helpers)
|
||||
(export compose disjoin any every choose reverse-filter fold reduce
|
||||
constant? keyword? list-of-user-primitives list-of-system-primitives
|
||||
user-primitive? system-primitive? primitive? predicate-primitive?
|
||||
value-primitive? effect-primitive? effect-free-primitive? gen-label
|
||||
reset-seed gen-symbol set? iota with-values
|
||||
empty-set singleton-set
|
||||
add-element member? empty? union intersection difference
|
||||
variable? datum? list-index primapp sys-primapp app const-datum const
|
||||
var quoted-const time printf system interpret pretty-print format set-cons
|
||||
define-who)
|
||||
(import (rnrs)
|
||||
(tests implementation-helpers)
|
||||
(nanopass helpers))
|
||||
|
||||
(define-syntax primapp
|
||||
(syntax-rules ()
|
||||
[(_ expr expr* ...) (expr expr* ...)]))
|
||||
|
||||
(define-syntax sys-primapp
|
||||
(syntax-rules ()
|
||||
[(_ expr expr* ...) (expr expr* ...)]))
|
||||
|
||||
(define-syntax app
|
||||
(syntax-rules ()
|
||||
[(_ expr expr* ...) (expr expr* ...)]))
|
||||
|
||||
(define-syntax const-datum
|
||||
(syntax-rules ()
|
||||
[(_ expr) (quote expr)]))
|
||||
|
||||
(define-syntax const
|
||||
(syntax-rules ()
|
||||
[(_ expr) expr]))
|
||||
|
||||
(define-syntax var
|
||||
(syntax-rules ()
|
||||
[(_ expr) expr]))
|
||||
|
||||
(define-syntax quoted-const
|
||||
(syntax-rules ()
|
||||
[(_ expr) (quote expr)]))
|
||||
|
||||
(define compose
|
||||
(case-lambda
|
||||
[() (lambda (x) x)]
|
||||
[(f) f]
|
||||
[(f . g*) (lambda (x) (f ((apply compose g*) x)))]))
|
||||
|
||||
(define disjoin
|
||||
(case-lambda
|
||||
[() (lambda (x) #f)]
|
||||
[(p?) p?]
|
||||
[(p? . q?*) (lambda (x)
|
||||
(or (p? x) ((apply disjoin q?*) x)))]))
|
||||
|
||||
(define any
|
||||
(lambda (pred? ls)
|
||||
(let loop ([ls ls])
|
||||
(cond
|
||||
[(null? ls) #f]
|
||||
[(pred? (car ls)) #t]
|
||||
[else (loop (cdr ls))]))))
|
||||
|
||||
(define every
|
||||
(lambda (pred? ls)
|
||||
(let loop ([ls ls])
|
||||
(cond
|
||||
[(null? ls) #t]
|
||||
[(pred? (car ls)) (loop (cdr ls))]
|
||||
[else #f]))))
|
||||
|
||||
(define choose
|
||||
(lambda (pred? ls)
|
||||
(fold (lambda (elt tail)
|
||||
(if (pred? elt)
|
||||
(cons elt tail)
|
||||
tail))
|
||||
'()
|
||||
ls)))
|
||||
|
||||
(define reverse-filter
|
||||
(lambda (pred? ls)
|
||||
(fold (lambda (elt tail)
|
||||
(if (pred? elt)
|
||||
tail
|
||||
(cons elt tail)))
|
||||
'()
|
||||
ls)))
|
||||
|
||||
;; fold op base (cons a (cons b (cons c '()))) =
|
||||
;; (op a (op b (op c base)))
|
||||
(define fold
|
||||
(lambda (op base ls)
|
||||
(let recur ([ls ls])
|
||||
(if (null? ls)
|
||||
base
|
||||
(op (car ls) (recur (cdr ls)))))))
|
||||
|
||||
;; reduce op base (cons a (cons b (cons c '())))
|
||||
;; (op c (op b (op a base)))
|
||||
(define reduce
|
||||
(lambda (op base ls)
|
||||
(let loop ([ls ls] [ans base])
|
||||
(if (null? ls)
|
||||
ans
|
||||
(loop (cdr ls) (op (car ls) ans))))))
|
||||
|
||||
;;; General Scheme helpers for the compiler
|
||||
(define constant?
|
||||
(disjoin null? number? char? boolean? string?))
|
||||
|
||||
(define keyword?
|
||||
(lambda (x)
|
||||
(and (memq x '(quote set! if begin let letrec lambda)) #t)))
|
||||
|
||||
(define datum?
|
||||
(lambda (x)
|
||||
(or (constant? x)
|
||||
(null? x)
|
||||
(if (pair? x)
|
||||
(and (datum? (car x)) (datum? (cdr x)))
|
||||
(and (vector? x) (for-all datum? (vector->list x)))))))
|
||||
|
||||
(define variable? symbol?)
|
||||
|
||||
(define list-of-user-primitives
|
||||
'(; not is a special case
|
||||
(not 1 not)
|
||||
|
||||
; predicates
|
||||
(< 2 test)
|
||||
(<= 2 test)
|
||||
(= 2 test)
|
||||
(boolean? 1 test)
|
||||
(char? 1 test)
|
||||
(eq? 2 test)
|
||||
(integer? 1 test)
|
||||
(null? 1 test)
|
||||
(pair? 1 test)
|
||||
(procedure? 1 test)
|
||||
|
||||
(vector? 1 test)
|
||||
(zero? 1 test)
|
||||
|
||||
; value-producing
|
||||
(* 2 value)
|
||||
(+ 2 value)
|
||||
(- 2 value)
|
||||
(add1 1 value)
|
||||
(car 1 value)
|
||||
(cdr 1 value)
|
||||
(char->integer 1 value)
|
||||
(cons 2 value)
|
||||
|
||||
(make-vector 1 value)
|
||||
(quotient 2 value)
|
||||
(remainder 2 value)
|
||||
|
||||
(sub1 1 value)
|
||||
|
||||
(vector -1 value)
|
||||
(vector-length 1 value)
|
||||
(vector-ref 2 value)
|
||||
(void 0 value)
|
||||
|
||||
; side-effecting
|
||||
(set-car! 2 effect)
|
||||
(set-cdr! 2 effect)
|
||||
|
||||
(vector-set! 3 effect)))
|
||||
|
||||
(define list-of-system-primitives ; these are introduced later by the compiler
|
||||
'(; value-producing
|
||||
(closure-ref 2 value)
|
||||
(make-closure 2 value)
|
||||
(procedure-code 1 value)
|
||||
|
||||
; side-effecting
|
||||
(closure-set! 3 effect)
|
||||
|
||||
(fref 1 value)
|
||||
(fset! 2 effect)
|
||||
(fincr! 1 effect)
|
||||
(fdecr! 1 effect)
|
||||
(href 2 value)
|
||||
(hset! 3 effect)
|
||||
(logand 2 value)
|
||||
(sll 2 value)
|
||||
(sra 2 value)))
|
||||
|
||||
(define user-primitive?
|
||||
(lambda (x)
|
||||
(and (assq x list-of-user-primitives) #t)))
|
||||
|
||||
(define system-primitive?
|
||||
(lambda (x)
|
||||
(and (assq x list-of-system-primitives) #t)))
|
||||
|
||||
(define primitive?
|
||||
(lambda (x)
|
||||
(or (user-primitive? x) (system-primitive? x))))
|
||||
|
||||
(define predicate-primitive?
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(or (assq x list-of-user-primitives)
|
||||
(assq x list-of-system-primitives)) =>
|
||||
(lambda (a) (eq? (caddr a) 'test))]
|
||||
[else #f])))
|
||||
|
||||
(define value-primitive?
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(or (assq x list-of-user-primitives)
|
||||
(assq x list-of-system-primitives)) =>
|
||||
(lambda (a) (eq? (caddr a) 'value))]
|
||||
[else #f])))
|
||||
|
||||
(define effect-primitive?
|
||||
(lambda (x)
|
||||
(cond
|
||||
[(or (assq x list-of-user-primitives)
|
||||
(assq x list-of-system-primitives)) =>
|
||||
(lambda (a) (eq? (caddr a) 'effect))]
|
||||
[else #f])))
|
||||
|
||||
(define effect-free-primitive?
|
||||
(lambda (x)
|
||||
(not (effect-primitive? x))))
|
||||
|
||||
(define gen-label
|
||||
; at some point, gen-label should be redefined to emit
|
||||
; assembler-friendly labels
|
||||
(lambda (sym)
|
||||
(string->symbol (format "~a%" sym))))
|
||||
|
||||
(define gen-symbol-seed 0)
|
||||
|
||||
(define reset-seed
|
||||
(lambda ()
|
||||
(set! gen-symbol-seed 0)))
|
||||
|
||||
(define gen-symbol
|
||||
(lambda (sym)
|
||||
(set! gen-symbol-seed (+ gen-symbol-seed 1))
|
||||
(string->symbol (format "~a_~s" sym gen-symbol-seed))))
|
||||
|
||||
(define set?
|
||||
(lambda (ls)
|
||||
(or (null? ls)
|
||||
(and (not (memq (car ls) (cdr ls))) (set? (cdr ls))))))
|
||||
|
||||
;;; ====================
|
||||
;;; Extra syntax and helpers for multiple values
|
||||
|
||||
;;; Set abstraction
|
||||
(define empty-set (lambda () '()))
|
||||
|
||||
(define singleton-set (lambda (elt) (list elt)))
|
||||
|
||||
(define add-element
|
||||
(lambda (elt set)
|
||||
(if (member? elt set)
|
||||
set
|
||||
(cons elt set))))
|
||||
|
||||
(define member? memq)
|
||||
|
||||
(define empty? null?)
|
||||
|
||||
(define set-cons
|
||||
(lambda (a set)
|
||||
(if (memq a set) set (cons a set))))
|
||||
|
||||
(define union
|
||||
(case-lambda
|
||||
[() (empty-set)]
|
||||
[(set1 set2)
|
||||
(cond
|
||||
[(empty? set1) set2]
|
||||
[(empty? set2) set1]
|
||||
[(eq? set1 set2) set1]
|
||||
[else (reduce (lambda (elt set)
|
||||
(if (member? elt set2) set (cons elt set)))
|
||||
set2
|
||||
set1)])]
|
||||
[(set1 . sets)
|
||||
(if (null? sets)
|
||||
set1
|
||||
(union set1 (reduce union (empty-set) sets)))]))
|
||||
|
||||
(define intersection
|
||||
(lambda (set1 . sets)
|
||||
(cond
|
||||
[(null? sets) set1]
|
||||
[(any empty? sets) (empty-set)]
|
||||
[else (choose
|
||||
(lambda (elt)
|
||||
(every (lambda (set) (member? elt set)) sets)) set1)])))
|
||||
|
||||
(define list-index
|
||||
(lambda (a ls)
|
||||
(cond
|
||||
[(null? ls) -1]
|
||||
[(eq? (car ls) a) 0]
|
||||
[else (maybe-add1 (list-index a (cdr ls)))])))
|
||||
|
||||
(define maybe-add1
|
||||
(lambda (n)
|
||||
(if (= n -1) -1 (+ n 1))))
|
||||
|
||||
(define difference
|
||||
(lambda (set1 . sets)
|
||||
(let ((sets (reverse-filter empty? sets)))
|
||||
(cond
|
||||
[(null? sets) set1]
|
||||
[else (reverse-filter (lambda (elt)
|
||||
(any (lambda (set)
|
||||
(member? elt set))
|
||||
sets))
|
||||
set1)])))))
|
6
nanopass/tests/implementation-helpers.chezscheme.sls
Normal file
6
nanopass/tests/implementation-helpers.chezscheme.sls
Normal file
|
@ -0,0 +1,6 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests implementation-helpers)
|
||||
(export time printf system interpret pretty-print format)
|
||||
(import (only (chezscheme) time printf system interpret pretty-print format)))
|
19
nanopass/tests/implementation-helpers.ikarus.ss
Normal file
19
nanopass/tests/implementation-helpers.ikarus.ss
Normal file
|
@ -0,0 +1,19 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests implementation-helpers)
|
||||
(export time printf system interpret pretty-print format)
|
||||
(import (ikarus))
|
||||
|
||||
(library
|
||||
(nanopass testing-environment)
|
||||
(export not < <= = boolean? char? eq? integer? null? pair? procedure?
|
||||
vector? zero? * + - add1 car cdr char->integer cons make-vector
|
||||
quotient remainder sub1 vector vector-length vector-ref void
|
||||
set-car! set-cdr! vector-set! quote set! if begin lambda let
|
||||
letrec)
|
||||
(import (rnrs) (rnrs mutable-pairs) (ikarus)))
|
||||
|
||||
(define interpret
|
||||
(lambda (src)
|
||||
(eval src (environment '(nanopass testing-environment))))))
|
23
nanopass/tests/implementation-helpers.ironscheme.sls
Normal file
23
nanopass/tests/implementation-helpers.ironscheme.sls
Normal file
|
@ -0,0 +1,23 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests implementation-helpers)
|
||||
(export time printf system interpret pretty-print format)
|
||||
(import (ironscheme))
|
||||
|
||||
;; this seems to be only used for a pass not enabled. not sure how to use...
|
||||
(define (system . args) #f)
|
||||
|
||||
(library
|
||||
(nanopass testing-environment)
|
||||
(export not < <= = boolean? char? eq? integer? null? pair? procedure?
|
||||
vector? zero? * + - add1 car cdr char->integer cons make-vector
|
||||
quotient remainder sub1 vector vector-length vector-ref void
|
||||
set-car! set-cdr! vector-set! quote set! if begin lambda let
|
||||
letrec)
|
||||
(import (rnrs) (rnrs mutable-pairs) (ironscheme)))
|
||||
|
||||
|
||||
(define interpret
|
||||
(lambda (src)
|
||||
(eval src (environment '(nanopass testing-environment))))))
|
6
nanopass/tests/implementation-helpers.ss
Normal file
6
nanopass/tests/implementation-helpers.ss
Normal file
|
@ -0,0 +1,6 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests implementation-helpers)
|
||||
(export time printf system interpret pretty-print format)
|
||||
(import (only (scheme) time printf system interpret pretty-print format)))
|
40
nanopass/tests/implementation-helpers.vicare.sls
Normal file
40
nanopass/tests/implementation-helpers.vicare.sls
Normal file
|
@ -0,0 +1,40 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests implementation-helpers)
|
||||
(export time printf system interpret pretty-print format)
|
||||
(import (vicare))
|
||||
|
||||
(library
|
||||
(nanopass testing-environment)
|
||||
(export not < <= = boolean? char? eq? integer? null? pair? procedure?
|
||||
vector? zero? * + - add1 car cdr char->integer cons make-vector
|
||||
quotient remainder sub1 vector vector-length vector-ref void
|
||||
set-car! set-cdr! vector-set! quote set! if begin lambda let
|
||||
letrec)
|
||||
(import (rename (rnrs) (set! vicare:set!) (if vicare:if))
|
||||
(rnrs mutable-pairs)
|
||||
(rename (only (vicare) void sub1 add1 remainder quotient) (void vicare:void)))
|
||||
(define-syntax set!
|
||||
(syntax-rules ()
|
||||
[(_ x v) (call-with-values (lambda () (vicare:set! x v)) (case-lambda [() #!void] [(x) x]))]))
|
||||
(define-syntax if
|
||||
(syntax-rules ()
|
||||
[(_ t c) (call-with-values (lambda () (vicare:if t c)) (case-lambda [() #!void] [(x) x]))]
|
||||
[(_ t c a) (vicare:if t c a)]))
|
||||
(define-syntax void
|
||||
(syntax-rules ()
|
||||
[(_) (call-with-values (lambda () (vicare:void)) (case-lambda [() #!void] [(x) x]))])))
|
||||
|
||||
(define interpret
|
||||
(lambda (src)
|
||||
;; work around for vicare's strange handling of the return value of primitives like set!,
|
||||
;; which apparently returns no values.
|
||||
(call-with-values (lambda () (eval src (environment '(nanopass testing-environment))))
|
||||
(case-lambda
|
||||
[() #!void]
|
||||
[(x) x]))))
|
||||
|
||||
(define system
|
||||
(lambda (arg)
|
||||
(foreign-call "system" arg))))
|
102
nanopass/tests/new-compiler.ss
Normal file
102
nanopass/tests/new-compiler.ss
Normal file
|
@ -0,0 +1,102 @@
|
|||
;;; Copyright (c) 2000-2015 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests new-compiler)
|
||||
(export L0 parse-L0 unparse-L0)
|
||||
(import (rnrs) (nanopass) (tests helpers))
|
||||
|
||||
#|
|
||||
(compiler-passes '(
|
||||
parse-scheme ;; conversion? simplification? verification.
|
||||
convert-complex-datum ;; conversion/simplification
|
||||
uncover-assigned ;; analysis
|
||||
purify-letrec ;; conversion/simplification
|
||||
convert-assignments ;; conversion
|
||||
optimize-direct-call ;; optimization
|
||||
remove-anonymous-lambda ;; conversion
|
||||
sanitize-binding-forms ;; conversion/simplification
|
||||
uncover-free ;; analysis
|
||||
convert-closures ;; conversion
|
||||
optimize-known-call ;; optimization
|
||||
analyze-closure-size ;; analysis
|
||||
uncover-well-known ;; analysis (for optimization)
|
||||
optimize-free ;; optimization
|
||||
optimize-self-reference ;; optimization
|
||||
analyze-closure-size ;; analysis
|
||||
introduce-procedure-primitives ;; conversion
|
||||
lift-letrec ;; conversion
|
||||
normalize-context ;; conversion
|
||||
specify-representation ;; conversion
|
||||
uncover-locals ;; analysis
|
||||
remove-let ;; conversion
|
||||
verify-uil ;; verification
|
||||
remove-complex-opera* ;; conversion
|
||||
flatten-set! ;; conversion
|
||||
impose-calling-conventions ;; conversion
|
||||
expose-allocation-pointer ;; conversion
|
||||
uncover-frame-conflict ;; conversion
|
||||
pre-assign-frame ;;
|
||||
assign-new-frame
|
||||
(iterate
|
||||
finalize-frame-locations
|
||||
select-instructions
|
||||
uncover-register-conflict
|
||||
assign-registers
|
||||
(break when everybody-home?)
|
||||
assign-frame)
|
||||
discard-call-live
|
||||
finalize-locations
|
||||
expose-frame-var
|
||||
expose-memory-operands
|
||||
expose-basic-blocks
|
||||
#;optimize-jumps
|
||||
flatten-program
|
||||
generate-x86-64
|
||||
))
|
||||
|#
|
||||
|
||||
(define vector-for-all
|
||||
(lambda (p? x)
|
||||
(let loop ([n (fx- (vector-length x) 1)])
|
||||
(cond
|
||||
[(fx<? n 0) #t]
|
||||
[(not (p? (vector-ref x n))) #f]
|
||||
[else (loop (fx- n 1))]))))
|
||||
|
||||
(define target-fixnum?
|
||||
(lambda (x)
|
||||
(and (integer? x) (exact? x)
|
||||
(<= (- (ash 1 60)) x (- (ash 1 60) 1)))))
|
||||
|
||||
(define constant?
|
||||
(lambda (x)
|
||||
(or (eq? x #t) (eq? x #f) (eq? x '()) (target-fixnum? x))))
|
||||
|
||||
(define scheme-object?
|
||||
(lambda (x)
|
||||
(or (constant? x)
|
||||
(and (pair? x) (scheme-object? (car x)) (scheme-object? (cdr x)))
|
||||
(and (vector? x) (vector-for-all scheme-object? x)))))
|
||||
|
||||
(define-language L0
|
||||
(terminals
|
||||
(constant (c))
|
||||
(scheme-object (d))
|
||||
(variable (x))
|
||||
(primitive (pr)))
|
||||
(Expr (e body)
|
||||
c
|
||||
x
|
||||
(quote d)
|
||||
(if e0 e1)
|
||||
(if e0 e1 e2)
|
||||
(and e* ...)
|
||||
(or e* ...)
|
||||
(begin e* ... e)
|
||||
(lambda (x* ...) body body* ...)
|
||||
(let ([x* e*] ...) body body* ...)
|
||||
(letrec ([x* e*] ...) body body* ...)
|
||||
(set! x e)
|
||||
(pr e* ...)
|
||||
(e0 e* ...)))
|
||||
)
|
281
nanopass/tests/synforms.ss
Normal file
281
nanopass/tests/synforms.ss
Normal file
|
@ -0,0 +1,281 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
;;; AWK - TODO - Once the meta-parser can handle language passes that match
|
||||
;;; a single variable.
|
||||
;;; FIXME - For Ikarus, I needed to use "dots" instead of the ".."
|
||||
;;; because Ikarus sees .. as a syntax error, even when it is
|
||||
;;; exported as an auxiliary keyword.
|
||||
|
||||
;;; Time-stamp: <2000-01-10 12:29:38 kemillik>
|
||||
;;; (time-stamp generated by emacs: Type M-x time-stamp anywhere to update)
|
||||
|
||||
;;; syncase is a pattern matcher where patterns are quoted or
|
||||
;;; quasiquoted expressions, or symbols. Unquoted symbols denote
|
||||
;;; pattern variables. All quoted things must match precisely.
|
||||
;;; Also, there is a symbol ".." that may be used to allow repetitions
|
||||
;;; of the preceeding pattern. Any pattern variables within are bound
|
||||
;;; to a list of matches. ".." may be nested.
|
||||
;;; Below is the canonical example of "let"
|
||||
|
||||
;;; [`(let ([,var ,rhs] ..) ,body0 ,body1 ..)
|
||||
;;; (guard (for-all symbol? var) (no-duplicates? var))
|
||||
;;; `((lambda ,var ,body0 ,@body1) ,@rhs)]
|
||||
|
||||
;;; For the pattern to match, the optional guard requires its
|
||||
;;; arguments to be true. The guard also uses the pattern
|
||||
;;; variables.
|
||||
|
||||
;;; We have added three obvious new forms: synlambda, synlet, and
|
||||
;;; synlet*. Finally, we have added a very useful operation,
|
||||
;;; make-double-collector-over-list, whose description follows from the
|
||||
;;; very simple code below.
|
||||
;;; Here are some descriptive examples of each of the new special forms.
|
||||
|
||||
;;;> (define foo
|
||||
;;; (synlambda `((if ,exp0 ,exp1) ,env)
|
||||
;;; (guard (number? exp1))
|
||||
;;; `(,env (if ,exp0 ,exp1 0))))
|
||||
;;;> (foo '(if 1 2) 'anenv)
|
||||
;;;(anenv (if 1 2 0))
|
||||
|
||||
;;;> (synlet ([`(if ,exp0 ,exp1)
|
||||
;;; (guard (number? exp0))
|
||||
;;; '(if 0 1)])
|
||||
;;; `(if ,exp1, exp0))
|
||||
;;;(if 1 0)
|
||||
|
||||
;;;> (synlet ([`(if ,x ,y ,z) '(if 1 2 3)]
|
||||
;;; [`(if ,a then ,b else ,c) '(if 1 then 2 else 3)]
|
||||
;;; [`(when ,u ,w) (guard (number? u) (number? w) (= u w))
|
||||
;;; '(when 1 1)])
|
||||
;;; (list x y z a b c a b))
|
||||
;;; (1 2 3 1 2 3 1 2)
|
||||
|
||||
;;;> (synlet* ([`(if ,exp0 ,exp1) (guard (number? exp0)) '(if 0 1)]
|
||||
;;; [`(if ,x ,y ,exp2) `(if ,exp0 ,exp1 5)])
|
||||
;;; `(if ,exp0 ,y ,exp2))
|
||||
;;;(if 0 1 5)
|
||||
|
||||
(library (tests synforms)
|
||||
(export syncase)
|
||||
(import (rnrs))
|
||||
|
||||
(define-syntax syncase
|
||||
(syntax-rules ()
|
||||
[(_ Exp (Clause ...) ...)
|
||||
(let ([x Exp])
|
||||
(call/cc
|
||||
(lambda (succeed)
|
||||
(pm:c start x succeed Clause ...)
|
||||
...
|
||||
(error 'syncase "No match for ~s" x))))]))
|
||||
|
||||
(define-syntax pm:c
|
||||
(syntax-rules (guard start finish)
|
||||
[(pm:c start V Succ Pattern (guard Exp ...) Body0 Body ...)
|
||||
(pm:parse start Pattern
|
||||
(pm:c finish V
|
||||
(when (and Exp ...)
|
||||
(Succ (begin Body0 Body ...)))))]
|
||||
[(pm:c finish V Body Pattern UsedFormals)
|
||||
(pm:find-dup UsedFormals
|
||||
(cont (Dup)
|
||||
(pm:error "Duplicate patvar ~s in pattern ~s" Dup Pattern))
|
||||
(cont () (pm V Pattern Body)))]
|
||||
[(_ start V Succ Pattern Body0 Body ...)
|
||||
(pm:c start V Succ Pattern (guard) Body0 Body ...)]
|
||||
[(_ start V Succ Pattern)
|
||||
(pm:error "Missing body for pattern ~s" Pattern)]))
|
||||
|
||||
(define-syntax pm:parse ;; returns parsed thing + used formals
|
||||
(syntax-rules (dots quasiquote quote unquote start)
|
||||
[(pm:parse start () K) (pm:ak K (null) ())]
|
||||
[(pm:parse start (unquote X) K) (pm:ak K (formal X) (X))]
|
||||
[(pm:parse start (A . D) K) (pm:parseqq start (A . D) K)]
|
||||
[(pm:parse start X K) (pm:ak K (keyword X) ())]))
|
||||
|
||||
(define-syntax pm:parseqq;; returns parsed thing + used formals
|
||||
(lambda (x)
|
||||
(syntax-case x (unquote start dothead dottail dottemps pairhead pairtail)
|
||||
[(pm:parseqq start (unquote ()) K) #'(pm:error "Bad variable: ~s" ())]
|
||||
[(pm:parseqq start (unquote (quasiquote X)) K) #'(pm:parseqq start X K)]
|
||||
[(pm:parseqq start (unquote (X . Y)) K)
|
||||
#'(pm:error "Bad variable: ~s" (X . Y))]
|
||||
[(pm:parseqq start (unquote #(X ...)) K)
|
||||
#'(pm:error "Bad variable: ~s" #(X ...))]
|
||||
[(pm:parseqq start (unquote X) K) #'(pm:ak K (formal X) (X))]
|
||||
[(pm:parseqq start (X dots . Y) K)
|
||||
(eq? (syntax->datum #'dots) '...)
|
||||
#'(pm:parseqq start X (pm:parseqq dothead Y K))]
|
||||
[(pm:parseqq dothead Y K Xpat Xformals)
|
||||
#'(pm:parseqq^ start Y () ()
|
||||
(pm:parseqq dottail Xpat Xformals K))]
|
||||
[(pm:parseqq dottail Xpat Xformals K Yrevpat Yformals)
|
||||
#'(pm:gen-temps Xformals ()
|
||||
(pm:parseqq dottemps Xpat Yrevpat Xformals Yformals K))]
|
||||
[(pm:parseqq dottemps Xpat Yrevpat (Xformal ...) (Yformal ...) K Xtemps)
|
||||
#'(pm:ak K (dots (Xformal ...) Xtemps Xpat Yrevpat)
|
||||
(Xformal ... Yformal ...))]
|
||||
[(pm:parseqq start (X . Y) K)
|
||||
#'(pm:parseqq start X (pm:parseqq pairhead Y K))]
|
||||
[(pm:parseqq pairhead Y K Xpat Xformals)
|
||||
#'(pm:parseqq start Y (pm:parseqq pairtail Xpat Xformals K))]
|
||||
[(pm:parseqq pairtail Xpat (Xformal ...) K Ypat (Yformal ...))
|
||||
#'(pm:ak K (pair Xpat Ypat) (Xformal ... Yformal ...))]
|
||||
[(pm:parseqq start X K) #'(pm:ak K (keyword X) ())])))
|
||||
|
||||
(define-syntax pm:parseqq^;; returns list-of parsed thing + used formals
|
||||
(syntax-rules (dots start pairhead)
|
||||
[(pm:parseqq^ start () Acc Used K) (pm:ak K Acc ())]
|
||||
[(pm:parseqq^ start (dots . Y) Acc Used K)
|
||||
(pm:error "Illegal continuation of list pattern beyond dots: ~s" Y)]
|
||||
[(pm:parseqq^ start (X . Y) Acc Used K)
|
||||
(pm:parseqq start X (pm:parseqq^ pairhead Y Acc Used K))]
|
||||
[(pm:parseqq^ pairhead Y Acc (Used ...) K Xpat (Xformal ...))
|
||||
(pm:parseqq^ start Y (Xpat . Acc) (Used ... Xformal ...) K)]
|
||||
[(pm:parseqq^ start X Acc Used K) (pm:error "Bad pattern ~s" X)]))
|
||||
|
||||
(define-syntax pm
|
||||
(syntax-rules (keyword formal dots null pair)
|
||||
[(pm V (keyword K) Body) (when (eqv? V 'K) Body)]
|
||||
[(pm V (formal F) Body) (let ((F V)) Body)]
|
||||
[(pm V (dots Dformals DTemps DPat (PostPat ...)) Body)
|
||||
(when (list? V)
|
||||
(let ((rev (reverse V)))
|
||||
(pm:help rev (PostPat ...) Dformals DTemps DPat Body)))]
|
||||
[(pm V (null) Body) (when (null? V) Body)]
|
||||
[(pm V (pair P0 P1) Body)
|
||||
(when (pair? V)
|
||||
(let ((X (car V)) (Y (cdr V)))
|
||||
(pm X P0 (pm Y P1 Body))))]))
|
||||
|
||||
(define-syntax pm:help
|
||||
(syntax-rules ()
|
||||
[(pm:help V () (DFormal ...) (DTemp ...) DPat Body)
|
||||
(let f ((ls V) (DTemp '()) ...)
|
||||
(if (null? ls)
|
||||
(let ((DFormal DTemp) ...) Body)
|
||||
(let ((X (car ls)) (Y (cdr ls)))
|
||||
(pm X DPat
|
||||
(f Y (cons DFormal DTemp) ...)))))]
|
||||
[(pm:help V (Post0 PostPat ...) DFormals DTemps DPat Body)
|
||||
(when (pair? V)
|
||||
(let ((X (car V)) (Y (cdr V)))
|
||||
(pm X Post0
|
||||
(pm:help Y (PostPat ...) DFormals DTemps DPat Body))))]))
|
||||
|
||||
(define-syntax pm:error
|
||||
(syntax-rules ()
|
||||
[(pm:error X ...) (error 'syncase 'X ...)]))
|
||||
|
||||
(define-syntax pm:eq?
|
||||
(syntax-rules ()
|
||||
[(_ A B SK FK) ; b should be an identifier
|
||||
(let-syntax ([f (syntax-rules (B)
|
||||
[(f B _SK _FK) (pm:ak _SK)]
|
||||
[(f nonB _SK _FK) (pm:ak _FK)])])
|
||||
(f A SK FK))]))
|
||||
|
||||
(define-syntax pm:member?
|
||||
(syntax-rules ()
|
||||
[(pm:member? A () SK FK) (pm:ak FK)]
|
||||
[(pm:member? A (Id0 . Ids) SK FK)
|
||||
(pm:eq? A Id0 SK (cont () (pm:member? A Ids SK FK)))]))
|
||||
|
||||
(define-syntax pm:find-dup
|
||||
(syntax-rules ()
|
||||
[(pm:find-dup () SK FK) (pm:ak FK)]
|
||||
[(pm:find-dup (X . Y) SK FK)
|
||||
(pm:member? X Y
|
||||
(cont () (pm:ak SK X)) (cont () (pm:find-dup Y SK FK)))]))
|
||||
|
||||
(define-syntax pm:gen-temps
|
||||
(syntax-rules ()
|
||||
[(_ () Acc K) (pm:ak K Acc)]
|
||||
[(_ (X . Y) Acc K) (pm:gen-temps Y (temp . Acc) K)]))
|
||||
|
||||
;;; ------------------------------
|
||||
;;; Continuation representation and stuff
|
||||
(define-syntax cont ; broken for non-nullary case
|
||||
(syntax-rules ()
|
||||
[(_ () Body) Body]
|
||||
[(_ (Var ...) Body Exp ...)
|
||||
(let-syntax ([f (syntax-rules ()
|
||||
[(_ Var ...) Body])])
|
||||
(f Exp ...))]))
|
||||
|
||||
(define-syntax pm:ak
|
||||
(syntax-rules ()
|
||||
[(_ (X Y ...) Z ...) (X Y ... Z ...)]))
|
||||
|
||||
;;; ------------------------------
|
||||
;;; tests
|
||||
|
||||
;(define exp0
|
||||
; '(syncase '((a) (b) (c d))
|
||||
; ((,zz ,ww) ((,zz .. ,ww) ..)
|
||||
; zz)))
|
||||
|
||||
;(define test
|
||||
; (lambda (x)
|
||||
; (pretty-print x)
|
||||
; (pretty-print (eval x))
|
||||
; (newline)))
|
||||
;
|
||||
;(define test0 (lambda () (test exp0)))
|
||||
|
||||
;;; There are three additional special forms, which should be obvious.
|
||||
(define-syntax synlambda
|
||||
(syntax-rules (guard)
|
||||
[(_ pat (guard g ...) body0 body1 ...)
|
||||
(lambda (x)
|
||||
(syncase x
|
||||
[pat (guard g ...) (begin body0 body1 ...)]))]
|
||||
[(_ pat body0 body1 ...)
|
||||
(lambda (x)
|
||||
(syncase x
|
||||
[pat (begin body0 body1 ...)]))]))
|
||||
|
||||
(define-syntax synlet
|
||||
(syntax-rules (guard)
|
||||
[(_ ([pat (guard g) rhs] ...) body0 body1 ...)
|
||||
((synlambda `(,pat ...)
|
||||
(guard (and g ...)) body0 body1 ...) `(,rhs ...))]
|
||||
[(_ ([pat rhs] ...) body0 body1 ...)
|
||||
((synlambda `(,pat ...) body0 body1 ...) `(,rhs ...))]
|
||||
[(_ stuff ...) (synlet-all-guarded () stuff ...)]))
|
||||
|
||||
(define-syntax synlet-all-guarded
|
||||
(syntax-rules (guard)
|
||||
[(_ (x ...) () body0 body1 ...) (synlet (x ...) body0 body1 ...)]
|
||||
[(_ (x ...) ([pat (guard g0 g1 g2 ...) rhs] decl ...) body0 body1 ...)
|
||||
(synlet-all-guarded (x ... [pat (guard (and g0 g1 g2 ...)) rhs])
|
||||
(decl ...) body0 body1 ...)]
|
||||
[(_ (x ...) ([pat rhs] decl ...) body0 body1 ...)
|
||||
(synlet-all-guarded (x ... [pat (guard #t) rhs])
|
||||
(decl ...) body0 body1 ...)]
|
||||
[(_ (x ...) ([pat] decl ...) body0 body1 ...)
|
||||
(pm:error "synlet missing right-hand-side for pattern: ~s" pat)]
|
||||
[(_ () (decl ...)) (pm:error "synlet missing body")]))
|
||||
|
||||
(define-syntax synlet*
|
||||
(syntax-rules ()
|
||||
[(_ (dec) body0 body1 ...) (synlet (dec) body0 body1 ...)]
|
||||
[(_ (dec0 decl ...) body0 body1 ...)
|
||||
(synlet (dec0) (synlet* (decl ...) body0 body1 ...))]))
|
||||
|
||||
(define make-double-collector-over-list
|
||||
(lambda (constructor1 base1 constructor2 base2)
|
||||
(letrec ((loop42 (lambda args
|
||||
(if (not (= (length args) 2))
|
||||
(error 'syncase "Invalid rhs expression"))
|
||||
(let ([f (car args)] [arg (cadr args)])
|
||||
(cond
|
||||
[(null? arg) `(,base1 ,base2)]
|
||||
[else
|
||||
(synlet ([`(,x ,y) (f (car arg))]
|
||||
[`(,x* ,y*) (loop42 f (cdr arg))])
|
||||
`(,(constructor1 x x*)
|
||||
,(constructor2 y y*)))])))))
|
||||
loop42))))
|
200
nanopass/tests/test-driver.ss
Normal file
200
nanopass/tests/test-driver.ss
Normal file
|
@ -0,0 +1,200 @@
|
|||
;;; Copyright (c) 2000-2015 Dipanwita Sarkar, Andrew W. Keep, R. Kent Dybvig, Oscar Waddell
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests test-driver)
|
||||
(export define-passes pass-names passes tracer test-one test-all tests
|
||||
print-file)
|
||||
(import (rnrs) (tests helpers))
|
||||
|
||||
(define subst
|
||||
(lambda (new old tree)
|
||||
(cond
|
||||
[(null? tree) '()]
|
||||
[(equal? tree old) new]
|
||||
[(pair? tree) `(,(subst new old (car tree)) .
|
||||
,(subst new old (cdr tree)))]
|
||||
[else tree])))
|
||||
|
||||
(define void (lambda () (if #f #f)))
|
||||
|
||||
(define-syntax define-passes
|
||||
(syntax-rules ()
|
||||
[(_ p1 p2 ...) (list '(p1 p2 ...) (list p1 p2 ...))]))
|
||||
|
||||
(define passes
|
||||
(let ([pass-list '()])
|
||||
(case-lambda
|
||||
[() pass-list]
|
||||
[(x) (set! pass-list x)])))
|
||||
|
||||
(define-syntax pass-names
|
||||
(identifier-syntax (let ([passes (passes)])
|
||||
(if (null? passes) '() (car passes)))))
|
||||
|
||||
(define tests
|
||||
(let ([test-list '()])
|
||||
(case-lambda
|
||||
[() test-list]
|
||||
[(x) (set! test-list x)])))
|
||||
|
||||
(define tracer
|
||||
(let ([trace-list '()])
|
||||
(case-lambda
|
||||
[() trace-list]
|
||||
[(x)
|
||||
(set! trace-list
|
||||
(cond
|
||||
[(eq? x #t) pass-names]
|
||||
[(eq? x #f) '()]
|
||||
[(and (symbol? x) (memq x pass-names)) (list x)]
|
||||
[(and (list? x) (for-all (lambda (x) (memq x pass-names)) x)) x]
|
||||
[else (error 'tracer (format "invalid argument ~s" x))]))])))
|
||||
|
||||
(define test-all
|
||||
(case-lambda
|
||||
[() (test-all #t #f #f)]
|
||||
[(emit?) (test-all emit? #f #f)]
|
||||
[(emit? print-expr?) (test-all emit? print-expr? #f)]
|
||||
[(emit? print-expr? check-eval?)
|
||||
(for-each
|
||||
(lambda (x)
|
||||
(when print-expr? (pretty-print x))
|
||||
(unless (test-one x emit?)
|
||||
(error 'test-all "test failed")))
|
||||
(tests))]))
|
||||
|
||||
(define print-file
|
||||
(lambda (path)
|
||||
(with-input-from-file path
|
||||
(letrec ([f (lambda ()
|
||||
(unless (eof-object? (peek-char))
|
||||
(write-char (read-char))
|
||||
(f)))])
|
||||
f))))
|
||||
|
||||
(define test-one
|
||||
(case-lambda
|
||||
[(original-input-expr) (test-one original-input-expr #t)]
|
||||
[(original-input-expr emit?)
|
||||
(let ([answer (interpret original-input-expr)])
|
||||
(define-syntax on-error
|
||||
(syntax-rules ()
|
||||
[(_ e0 e1 e2 ...)
|
||||
(guard (e [else e0 (raise e)])
|
||||
e1 e2 ...)]))
|
||||
#;
|
||||
(define check-eval
|
||||
(lambda (pass-name input-expr output-expr)
|
||||
(on-error
|
||||
(begin
|
||||
(printf "~s input:~%" pass-name)
|
||||
(pretty-print input-expr)
|
||||
(printf "========~%~s output:~%" pass-name)
|
||||
(pretty-print output-expr))
|
||||
(let ([t (interpret output-exr)])
|
||||
(unless (equal? t answer)
|
||||
(error pass-name
|
||||
(format "answer is ~s, should have been ~s" t answer)))
|
||||
(let ([t (parameterize ([run-cp0 (lambda (cp0 x) x)])
|
||||
(interpret output-expr))])
|
||||
(unless (equal? t answer)
|
||||
(error pass-name "answer is ~s, should have been ~s"
|
||||
t answer)))))))
|
||||
(define check-eval
|
||||
(lambda (pass-name input-expr output-expr)
|
||||
(void)))
|
||||
(define run
|
||||
(lambda (input-expr pass-names pass-procs)
|
||||
(if (null? pass-names)
|
||||
input-expr
|
||||
(let ([pass-name (car pass-names)])
|
||||
(when (memq pass-name (tracer)) (printf "~%~s:~%" pass-name))
|
||||
(let ([pass (car pass-procs)])
|
||||
(let ([output-expr
|
||||
(on-error
|
||||
(begin
|
||||
(printf "~s input:~%" pass-name)
|
||||
(pretty-print input-expr))
|
||||
(pass input-expr))])
|
||||
(check-eval pass-name input-expr output-expr)
|
||||
(when (memq pass-name (tracer))
|
||||
(pretty-print output-expr))
|
||||
(run output-expr (cdr pass-names) (cdr pass-procs))))))))
|
||||
;; AWK - TODO - need to come up with more elegant handling of this
|
||||
;; since looking up generate-code for each test is
|
||||
;; pretty hackish. Maybe passes could handle this as
|
||||
;; well?
|
||||
(define generate-code
|
||||
(lambda (expr)
|
||||
(let ([passes (passes)])
|
||||
(if (null? passes)
|
||||
(error 'generate-code "No passes defined")
|
||||
(let ([proc (let l ([names (car passes)]
|
||||
[procs (cadr passes)])
|
||||
(cond
|
||||
[(null? names)
|
||||
(error 'generate-code
|
||||
"No generate-code pass defined")]
|
||||
[(eq? 'generate-code (car names)) (car procs)]
|
||||
[else (l (cdr names) (cdr procs))]))])
|
||||
(proc expr))))))
|
||||
(define run-code
|
||||
(lambda (input-expr)
|
||||
(define asm-file "t1.s")
|
||||
(define err-file "t1.err")
|
||||
(define out-file "t1.out")
|
||||
(when (memq 'generate-code (tracer)) (printf "~%generate-code:~%"))
|
||||
(on-error
|
||||
(begin
|
||||
(printf "generate-code input:~%")
|
||||
(pretty-print input-expr))
|
||||
(when (file-exists? asm-file) (delete-file asm-file))
|
||||
(with-output-to-file asm-file
|
||||
(lambda ()
|
||||
(printf "/* ~%")
|
||||
(pretty-print original-input-expr)
|
||||
(printf "*/~%~%")
|
||||
(print-file "canned.s")
|
||||
(newline)
|
||||
(generate-code input-expr))))
|
||||
(on-error
|
||||
(begin
|
||||
(printf "generate-code input:~%")
|
||||
(pretty-print input-expr)
|
||||
(printf "========~%generate-code output:~%")
|
||||
(print-file asm-file)
|
||||
(printf "========~%")
|
||||
(print-file err-file))
|
||||
(let ([t (assemble-and-run asm-file err-file out-file)])
|
||||
(unless (equal? t answer)
|
||||
(error 'generate-code
|
||||
(format "answer is ~s, should have been ~s"
|
||||
t answer)))))
|
||||
(when (memq 'generate-code (tracer)) (print-file asm-file))))
|
||||
(reset-seed)
|
||||
(let ([expr (run original-input-expr (car (passes)) (cadr (passes)))])
|
||||
(when (and emit? (memq 'generate-code pass-names))
|
||||
(run-code expr))
|
||||
#t))]))
|
||||
|
||||
(define assemble-and-run
|
||||
(lambda (asm-file err-file out-file)
|
||||
(define shell
|
||||
(lambda (s . args)
|
||||
(system (apply format s args))))
|
||||
(unless
|
||||
(= 0 (shell "cc -o run startup.c ~a > ~a 2>&1" asm-file err-file))
|
||||
(error 'generate-program "build error(s)"))
|
||||
(let ([status (shell "exec ./run > ~a 2>&1" out-file)])
|
||||
(shell "cat ~a >> ~a" out-file err-file)
|
||||
(unless (= status 0)
|
||||
(error 'generate-program "run error(s)")))
|
||||
; replace #<void> with "#<void>" to make it something the reader can
|
||||
; handle, then substitute void for "#<void>"
|
||||
(shell "sed -e 's/#<void>/\"#<void>\"/g' < ~a > ~a.tmp"
|
||||
out-file out-file)
|
||||
(let ([ip (open-input-file (format "~a.tmp" out-file))])
|
||||
(let ([x (subst (void) "#<void>" (read ip))])
|
||||
(close-input-port ip)
|
||||
x)))))
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
;;; Copyright (c) 2000-2015 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests unit-test-helpers-implementation)
|
||||
(export with-output-to-string display-condition format-error-message)
|
||||
(import (chezscheme))
|
||||
(define-syntax format-error-message
|
||||
(syntax-rules ()
|
||||
[(_ args ...) (parameterize ([print-level 3] [print-length 6]) (format args ...))])))
|
29
nanopass/tests/unit-test-helpers-implementation.ikarus.sls
Normal file
29
nanopass/tests/unit-test-helpers-implementation.ikarus.sls
Normal file
|
@ -0,0 +1,29 @@
|
|||
;;; Copyright (c) 2000-2015 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests unit-test-helpers-implementation)
|
||||
(export with-output-to-string display-condition format-error-message)
|
||||
(import (ikarus))
|
||||
|
||||
(define display-condition
|
||||
(case-lambda
|
||||
[(c) (display-condition c (current-output-port))]
|
||||
[(c op)
|
||||
(display
|
||||
(format "~a~a~a~a~a"
|
||||
(if (warning? c) "Warning" "Exception")
|
||||
(if (who-condition? c) (format " in ~s" (condition-who c)) "")
|
||||
(if (message-condition? c) (format ": ~a" (condition-message c)) "")
|
||||
(if (and (irritants-condition? c) (not (null? (condition-irritants c))))
|
||||
(format " with irritants ~s" (condition-irritants c))
|
||||
"")
|
||||
(if (syntax-violation? c)
|
||||
(if (syntax-violation-subform c)
|
||||
(format "~s in ~s" (syntax-violation-subform c) (syntax-violation-form c))
|
||||
(format "~s" (syntax-violation-form c)))
|
||||
""))
|
||||
op)]))
|
||||
|
||||
(define-syntax format-error-message
|
||||
(syntax-rules ()
|
||||
[(_ args ...) (format args ...)])))
|
|
@ -0,0 +1,36 @@
|
|||
;;; Copyright (c) 2000-2015 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests unit-test-helpers-implementation)
|
||||
(export with-output-to-string display-condition format-error-message)
|
||||
(import (ironscheme))
|
||||
|
||||
;; easy enough to define ;p
|
||||
(define (with-output-to-string thunk)
|
||||
(let-values (((p g) (open-string-output-port)))
|
||||
(parameterize ([current-output-port p])
|
||||
(thunk)
|
||||
(g))))
|
||||
|
||||
(define display-condition
|
||||
(case-lambda
|
||||
[(c) (display-condition c (current-output-port))]
|
||||
[(c op)
|
||||
(display
|
||||
(format "~a~a~a~a~a"
|
||||
(if (warning? c) "Warning" "Exception")
|
||||
(if (who-condition? c) (format " in ~s" (condition-who c)) "")
|
||||
(if (message-condition? c) (format ": ~a" (condition-message c)) "")
|
||||
(if (and (irritants-condition? c) (not (null? (condition-irritants c))))
|
||||
(format " with irritants ~s" (condition-irritants c))
|
||||
"")
|
||||
(if (syntax-violation? c)
|
||||
(if (syntax-violation-subform c)
|
||||
(format "~s in ~s" (syntax-violation-subform c) (syntax-violation-form c))
|
||||
(format "~s" (syntax-violation-form c)))
|
||||
""))
|
||||
op)]))
|
||||
|
||||
(define-syntax format-error-message
|
||||
(syntax-rules ()
|
||||
[(_ args ...) (format args ...)])))
|
32
nanopass/tests/unit-test-helpers-implementation.vicare.sls
Normal file
32
nanopass/tests/unit-test-helpers-implementation.vicare.sls
Normal file
|
@ -0,0 +1,32 @@
|
|||
;;; Copyright (c) 2000-2015 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests unit-test-helpers-implementation)
|
||||
(export with-output-to-string display-condition format-error-message)
|
||||
(import (vicare))
|
||||
|
||||
(define display-condition
|
||||
(case-lambda
|
||||
[(c) (display-condition c (current-output-port))]
|
||||
[(c op)
|
||||
(display
|
||||
(format "~a~a~a~a~a"
|
||||
(if (warning? c) "Warning" "Exception")
|
||||
(if (who-condition? c) (format " in ~s" (condition-who c)) "")
|
||||
(if (message-condition? c) (format ": ~a" (condition-message c)) "")
|
||||
(if (and (irritants-condition? c) (not (null? (condition-irritants c))))
|
||||
(format " with irritants ~s" (condition-irritants c))
|
||||
"")
|
||||
(if (syntax-violation? c)
|
||||
(if (syntax-violation-subform c)
|
||||
(format "~s in ~s" (syntax-violation-subform c) (syntax-violation-form c))
|
||||
(format "~s" (syntax-violation-form c)))
|
||||
""))
|
||||
op)]))
|
||||
|
||||
(define-syntax format-error-message
|
||||
(syntax-rules ()
|
||||
[(_ args ...) (format args ...)]))
|
||||
|
||||
;; needed to get an r6rs script to print with vicare
|
||||
(current-output-port (current-error-port)))
|
124
nanopass/tests/unit-test-helpers.ss
Normal file
124
nanopass/tests/unit-test-helpers.ss
Normal file
|
@ -0,0 +1,124 @@
|
|||
;;; Copyright (c) 2000-2018 Andrew W. Keep, R. Kent Dybvig
|
||||
;;; See the accompanying file Copyright for details
|
||||
|
||||
(library (tests unit-test-helpers)
|
||||
(export test-suite test assert-equal? assert-error with-output-to-string format-error-message)
|
||||
(import (rnrs) (tests unit-test-helpers-implementation) (only (nanopass helpers) errorf))
|
||||
|
||||
(define-syntax test-suite
|
||||
(lambda (x)
|
||||
(define name->run-name
|
||||
(lambda (name)
|
||||
(datum->syntax name
|
||||
(string->symbol
|
||||
(string-append "run-" (symbol->string (syntax->datum name)))))))
|
||||
(syntax-case x ()
|
||||
[(_ name test test* ...)
|
||||
(with-syntax ([run (name->run-name #'name)])
|
||||
#'(define run
|
||||
(lambda ()
|
||||
(display "Running ")
|
||||
(write (quote name))
|
||||
(display " test suite...\n")
|
||||
(let f ([tests (list (lambda () test) (lambda () test*) ...)]
|
||||
[successes 0] [failures 0] [exceptions 0])
|
||||
(if (null? tests)
|
||||
(begin
|
||||
(display "Ran ")
|
||||
(write (+ successes failures exceptions))
|
||||
(display " tests with ")
|
||||
(write successes)
|
||||
(display " successes, ")
|
||||
(write failures)
|
||||
(display " failures, and ")
|
||||
(write exceptions)
|
||||
(display " exceptions\n")
|
||||
(and (= failures 0) (= exceptions 0)))
|
||||
(guard (e [else
|
||||
(display " caught expection... ")
|
||||
(display-condition e)
|
||||
(newline)
|
||||
(f (cdr tests) successes failures
|
||||
(+ exceptions 1))])
|
||||
(let ([result ((car tests))])
|
||||
(write result)
|
||||
(newline)
|
||||
(if result
|
||||
(f (cdr tests) (+ successes 1) failures
|
||||
exceptions)
|
||||
(f (cdr tests) successes (+ failures 1)
|
||||
exceptions)))))))))])))
|
||||
|
||||
(define-syntax test
|
||||
(syntax-rules ()
|
||||
[(_ name assertion assertion* ...)
|
||||
(begin
|
||||
(display " Testing ")
|
||||
(write (quote name))
|
||||
(display " ...")
|
||||
(and assertion assertion* ...))]))
|
||||
|
||||
;; extended to cover record equality, but not doing the union-find
|
||||
;; equality we should be doing.
|
||||
(define stupid-extended-equal?
|
||||
(lambda (x y)
|
||||
(or (equal? x y)
|
||||
(and (record? x)
|
||||
(record? y)
|
||||
(record=? x y)))))
|
||||
|
||||
(define record-type-accessors
|
||||
(lambda (rtd)
|
||||
(let loop ([i (vector-length (record-type-field-names rtd))] [ls '()])
|
||||
(if (fx=? i 0)
|
||||
ls
|
||||
(let ([i (fx- i 1)])
|
||||
(loop i (cons (record-accessor rtd i) ls)))))))
|
||||
|
||||
(define record=?
|
||||
(lambda (x y)
|
||||
(let ([rtd (record-rtd x)])
|
||||
(and (eq? rtd (record-rtd y))
|
||||
(let loop ([rtd rtd])
|
||||
(or (eq? rtd #f)
|
||||
(and (for-all (lambda (ac) (stupid-extended-equal? (ac x) (ac y))) (record-type-accessors rtd))
|
||||
(loop (record-type-parent rtd)))))))))
|
||||
|
||||
(define-syntax assert-equal?
|
||||
(syntax-rules ()
|
||||
[(_ expected actual)
|
||||
(or (stupid-extended-equal? expected actual)
|
||||
(begin
|
||||
(newline)
|
||||
(display "!!! ")
|
||||
(write actual)
|
||||
(display " does not match expected: ")
|
||||
(write expected)
|
||||
(newline)
|
||||
#f))]))
|
||||
|
||||
(define-syntax assert-error
|
||||
(syntax-rules ()
|
||||
[(_ ?msg ?expr)
|
||||
(let ([msg ?msg])
|
||||
(guard (e [else
|
||||
(let ([e-msg (with-output-to-string
|
||||
(lambda ()
|
||||
(display-condition e)))])
|
||||
(or (string=? msg e-msg)
|
||||
(begin
|
||||
(newline)
|
||||
(display "!!! expected error message ")
|
||||
(write msg)
|
||||
(display " does not match ")
|
||||
(write e-msg)
|
||||
(newline)
|
||||
#f)))])
|
||||
(let ([t ?expr])
|
||||
(newline)
|
||||
(display "!!! expected error with message ")
|
||||
(write msg)
|
||||
(display " but got result ")
|
||||
(write t)
|
||||
(newline)
|
||||
#f)))])))
|
1105
nanopass/tests/unit-tests.ss
Normal file
1105
nanopass/tests/unit-tests.ss
Normal file
File diff suppressed because it is too large
Load diff
Reference in a new issue