(define length (lambda (L)
  (if (eq? L '())
      0
      (+ 1 (length (cdr L))))))

(define map (lambda (f L)
  (if (eq? L '())
      '()
      (cons (f (car L)) (map f (cdr L))))))

(define fibs (lambda (n)
  (if (= n 0)
      0
      (if (= n 1)
          1
          (+ (fibs (- n 1)) (fibs (- n 2)))))))

(define fact (lambda (n)
  (if (= n 0)
      1
      (* n (fact (- n 1))))))

(define equal? (lambda (x y)
  (if (pair? x)
    (and (pair? y)
         (equal? (car x) (car y))
         (equal? (cdr x) (cdr y)))
    (eqv? x y))))

(define 1+ (lambda (x) (+ x 1)))
(define 1- (lambda (x) (- x 1)))

(define succ 1+)
(define pred 1-)

(if (= (length '(a b c d e f g)) 7) 'passed 'failed)
(if (equal? (map (lambda (x) (* x x)) '(1 2 3 4 5))
            '(1 4 9 16 25))
  'passed 'failed)
(if (= (fibs 10) 55) 'passed 'failed)
(if (= (fact 10) 3628800) 'passed 'failed)
