]> git.rkrishnan.org Git - sicp.git/blobdiff - src/sicp/metacircular2-test.rkt
add tests for unless
[sicp.git] / src / sicp / metacircular2-test.rkt
index 563b0ec846fb4ac8bd1a3cc75238da83191f00f6..aa167f8b01649bca91727b90cf3f343cfedc53d9 100644 (file)
                             (* x z))
                          env1)
                    39
-                   "let* test"))))
+                   "let* test")
+     (eval '(define (f x)
+              (define (even? n)
+                (if (= n 0)
+                    true
+                    (odd? (- n 1))))
+              (define (odd? n)
+                (if (= n 0)
+                    false
+                    (even? (- n 1))))
+              (odd? x))
+           env1)
+     (check-equal? (eval '(f 2) env1) false "internal definitions")
+     (check-equal? (eval '(f 3) env1) true "internal definitions")
+     (eval '(define (f1 x)
+              (letrec ((even?
+                        (lambda (n)
+                          (if (= n 0)
+                              true
+                              (odd? (- n 1)))))
+                       (odd?
+                        (lambda (n)
+                          (if (= n 0)
+                              false
+                              (even? (- n 1))))))
+                (even? x)))
+           env1)
+     (check-equal? (eval '(f1 2) env1) true "internal definitions")
+     (check-equal? (eval '(f1 3) env1) false "internal definitions")
+     (eval '(define (fib n)
+              (let fib-iter ((a 1)
+                             (b 0)
+                             (count n))
+                (if (= count 0)
+                    b
+                    (fib-iter (+ a b) a (- count 1)))))
+           env1)
+     (check-equal? (eval '(fib 10) env1) 55 "named let")
+     (eval '(define (factorial n)
+              (if (= n 1)
+                  1
+                  (* (factorial (- n 1)) n)))
+           env1)
+     (check-equal? (eval '(factorial 10) env1) 3628800 "factorial test")
+     (check-equal? (eval '(unless true "true" "false") env1) "false" "unless test 1")
+     (check-equal? (eval '(unless false "true" "false") env1) "true" "unless test 2"))))
 
 
 (run-tests metacircular2-tests)
\ No newline at end of file