; The first three tests should produce parse errors

(eval-one-exp '
 (let ([a 4])
   (define a (lambda (x) (* x (+ x 2))))
   (a 4)
   (define b (lambda (y) (- y 7))
   (b 2))))

(eval-one-exp '
 (let ([a 4])
   (define a (lambda (x) (* x (+ x 2))))
   (define b (lambda (y) (- y 7)))))

(eval-one-exp '
 (let ([x 3])
   (if (< x 2)
       (define a (lambda (x) (- 2 x)))
       (define b (lambda (x) (+ 3 x))))
   (a 7)))

;  VALID TEST CASES

(eval-one-exp '
(let ([x 5])
  (define foo (lambda (y) (bar x y)))
  (define bar (lambda (a b) (+ (* a b) a)))
  (foo (+ x 3)))) ; answer 45

(eval-one-exp '
 ((lambda (x y)
    (define a (lambda (z) (+ x y z)))
    (define b (lambda (w) (+ w (* x y))))
    (list (a 4) (b 5)))
  6 7)) ; answer (17 47)

(eval-one-exp '
 (let ([a 10] [b (list 6)])
   (set-car! b 7)
   (letrec ([fact (lambda (n)
		    (if (zero? n)
			1
			(* n (fact (- n 1)))))])
     (define fib (lambda (n)
		   (if (< n 2)
		       n
		       (+ (fib (- n 1))
			  (fib (- n 2))))))
     (list (fib a) (fact (fib (car b)))))))
     ; answer (55 6227020800)


(eval-one-exp '
 (begin
   (define odd?
     (lambda (x)
       (define odd? (lambda (n)
		      (if (zero? n)
			  #f
			  (even? (- n 1)))))
       (define even? (lambda (m)
		       (if (zero? m)
			   #t
			   (odd? (- m 1)))))
       (odd? x)))
   (list (odd? 3) (odd? 4)))) ; answer (#t #f)

(eval-one-exp '
 ((lambda (x y)
    (define a (lambda (z) (+ (b x) y z)))
    (define b (lambda (w) (+ w (* x y))))
    (list (a 4) (b 5)))
  6 7)) ; answer (59 47)