(* 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