175 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Scheme
		
	
	
	
| 
 | |
| 
 | |
| (add-tests-with-string-output "letrec"
 | |
|   [(letrec () 12) => "12\n"]
 | |
|   [(letrec ([f 12]) f) => "12\n"]
 | |
|   [(letrec ([f 12] [g 13]) (fx+ f g)) => "25\n"]
 | |
|   [(letrec ([fact
 | |
|              (lambda (n)
 | |
|                (if (fxzero? n)
 | |
|                    1
 | |
|                    (fx* n (fact (fxsub1 n)))))])
 | |
|     (fact 5)) => "120\n"]
 | |
|   [(letrec ([f 12] [g (lambda () f)])
 | |
|      (g)) => "12\n"]
 | |
|   [(letrec ([f 12] [g (lambda (n) (set! f n))])
 | |
|     (g 130)
 | |
|     f) => "130\n"]
 | |
|   [(letrec ([f (lambda (g) (set! f g) (f))])
 | |
|      (f (lambda () 12))) => "12\n"]
 | |
|   [(letrec ([f (cons (lambda () f)
 | |
|                      (lambda (x) (set! f x)))])
 | |
|     (let ([g (car f)])
 | |
|       ((cdr f) 100)
 | |
|       (g))) => "100\n"]
 | |
|   [(letrec ([f (letrec ([g (lambda (x) (fx* x 2))])
 | |
|                   (lambda (n) (g (fx* n 2))))])
 | |
|       (f 12)) => "48\n"]
 | |
|   [(letrec ([f (lambda (f n)
 | |
|                   (if (fxzero? n)
 | |
|                       1
 | |
|                       (fx* n (f f (fxsub1 n)))))])
 | |
|       (f f 5)) => "120\n"]
 | |
|   [(let ([f (lambda (f)
 | |
|               (lambda (n)
 | |
|                  (if (fxzero? n)
 | |
|                      1
 | |
|                      (fx* n (f (fxsub1 n))))))])
 | |
|      (letrec ([fix
 | |
|                (lambda (f)
 | |
|                  (f (lambda (n) ((fix f) n))))])
 | |
|       ((fix f) 5))) => "120\n"]
 | |
| )
 | |
| 
 | |
| (add-tests-with-string-output "letrec*"
 | |
|   [(letrec* () 12) => "12\n"]
 | |
|   [(letrec* ([f 12]) f) => "12\n"]
 | |
|   [(letrec* ([f 12] [g 13]) (fx+ f g)) => "25\n"]
 | |
|   [(letrec* ([fact
 | |
|              (lambda (n)
 | |
|                (if (fxzero? n)
 | |
|                    1
 | |
|                    (fx* n (fact (fxsub1 n)))))])
 | |
|     (fact 5)) => "120\n"]
 | |
|   [(letrec* ([f 12] [g (lambda () f)])
 | |
|      (g)) => "12\n"]
 | |
|   [(letrec* ([f 12] [g (lambda (n) (set! f n))])
 | |
|     (g 130)
 | |
|     f) => "130\n"]
 | |
|   [(letrec* ([f (lambda (g) (set! f g) (f))])
 | |
|      (f (lambda () 12))) => "12\n"]
 | |
|   [(letrec* ([f (cons (lambda () f)
 | |
|                       (lambda (x) (set! f x)))])
 | |
|     (let ([g (car f)])
 | |
|       ((cdr f) 100)
 | |
|       (g))) => "100\n"]
 | |
|   [(letrec* ([f (letrec* ([g (lambda (x) (fx* x 2))])
 | |
|                    (lambda (n) (g (fx* n 2))))])
 | |
|       (f 12)) => "48\n"]
 | |
|   [(letrec* ([f (lambda (f n)
 | |
|                    (if (fxzero? n)
 | |
|                        1
 | |
|                        (fx* n (f f (fxsub1 n)))))])
 | |
|       (f f 5)) => "120\n"]
 | |
|   [(let ([f (lambda (f)
 | |
|               (lambda (n)
 | |
|                  (if (fxzero? n)
 | |
|                      1
 | |
|                      (fx* n (f (fxsub1 n))))))])
 | |
|      (letrec* ([fix
 | |
|                 (lambda (f)
 | |
|                   (f (lambda (n) ((fix f) n))))])
 | |
|       ((fix f) 5))) => "120\n"]
 | |
|   [(letrec* ([a 12] [b (fx+ a 5)] [c (fx+ b a)])
 | |
|       c) => "29\n"]
 | |
| )
 | |
| 
 | |
| 
 | |
| (add-tests-with-string-output "and/or"
 | |
|   [(and) => "#t\n"]
 | |
|   [(and 5) => "5\n"]
 | |
|   [(and #f) => "#f\n"]
 | |
|   [(and 5 6) => "6\n"]
 | |
|   [(and #f ((lambda (x) (x x)) (lambda (x) (x x)))) => "#f\n"]
 | |
|   [(or) => "#f\n"]
 | |
|   [(or #t) => "#t\n"]
 | |
|   [(or 5) => "5\n"]
 | |
|   [(or 1 2 3) => "1\n"]
 | |
|   [(or (cons 1 2) ((lambda (x) (x x)) (lambda (x) (x x)))) => "(1 . 2)\n"]
 | |
|   [(let ([if 12]) (or if 17)) => "12\n"]
 | |
|   [(let ([if 12]) (and if 17)) => "17\n"]
 | |
|   [(let ([let 8]) (or let 18)) => "8\n"]
 | |
|   [(let ([let 8]) (and let 18)) => "18\n"]
 | |
|   [(let ([t 1])
 | |
|      (and (begin (set! t (fxadd1 t)) t) t)) => "2\n"]
 | |
|   [(let ([t 1])
 | |
|      (or (begin (set! t (fxadd1 t)) t) t)) => "2\n"]
 | |
| )
 | |
| 
 | |
| 
 | |
| (add-tests-with-string-output "when/unless"
 | |
|   [(let ([x (cons 1 2)])
 | |
|      (when (pair? x) 
 | |
|        (set-car! x (fx+ (car x) (cdr x))))
 | |
|      x) => "(3 . 2)\n"]
 | |
|   [(let ([x (cons 1 2)])
 | |
|      (when (pair? x) 
 | |
|        (set-car! x (fx+ (car x) (cdr x)))
 | |
|        (set-car! x (fx+ (car x) (cdr x))))
 | |
|      x) => "(5 . 2)\n"]
 | |
|   [(let ([x (cons 1 2)])
 | |
|      (unless (fixnum? x) 
 | |
|        (set-car! x (fx+ (car x) (cdr x))))
 | |
|      x) => "(3 . 2)\n"]
 | |
|   [(let ([x (cons 1 2)])
 | |
|      (unless (fixnum? x) 
 | |
|        (set-car! x (fx+ (car x) (cdr x)))
 | |
|        (set-car! x (fx+ (car x) (cdr x))))
 | |
|      x) => "(5 . 2)\n"]
 | |
|   [(let ([let 12])
 | |
|      (when let let let let let)) => "12\n"]
 | |
|   [(let ([let #f])
 | |
|      (unless let let let let let)) => "#f\n"]
 | |
|   )
 | |
| 
 | |
| 
 | |
| (add-tests-with-string-output "cond"
 | |
|   [(cond [1 2] [else 3]) => "2\n"]
 | |
|   [(cond [1] [else 13]) => "1\n"]
 | |
|   [(cond [#f #t] [#t #f]) => "#f\n"]
 | |
|   [(cond [else 17]) => "17\n"]
 | |
|   [(cond [#f] [#f 12] [12 13]) => "13\n"]
 | |
|   [(cond [(cons 1 2) => (lambda (x) (cdr x))]) => "2\n"]
 | |
|   [(let ([else #t])
 | |
|      (cond
 | |
|       [else 1287])) => "1287\n"]
 | |
|   [(let ([else 17])
 | |
|      (cond
 | |
|       [else])) => "17\n"]
 | |
|   [(let ([else 17])
 | |
|      (cond
 | |
|       [else => (lambda (x) x)])) => "17\n"]
 | |
|   [(let ([else #f])
 | |
|      (cond 
 | |
|        [else ((lambda (x) (x x)) (lambda (x) (x x)))])
 | |
|      else) => "#f\n"]
 | |
|   [(let ([=> 12])
 | |
|     (cond
 | |
|      [12 => 14]
 | |
|      [else 17])) => "14\n"]
 | |
|   [(let ([=> 12])
 | |
|     (cond
 | |
|       [=>])) => "12\n"]
 | |
|   [(let ([=> 12])
 | |
|     (cond
 | |
|       [=> =>])) => "12\n"]
 | |
|   [(let ([=> 12])
 | |
|     (cond
 | |
|       [=> => =>])) => "12\n"]
 | |
|   [(let ([let 12])
 | |
|     (cond
 | |
|       [let => (lambda (x) (fx+ let x))]
 | |
|       [else 14])) => "24\n"]
 | |
| )
 | |
| 
 |