1. How to recur on a list of atoms, a number and an S-expression | 23 64 83
  2. Cons to build | 37
  3. Typical element, cons & recur | 45
  4. Change >= 1 arg closer to termination & test | 57 65 84
  5. +, X & cons; test 0,1,() | 67
  6. When to simplify | 94
  7. Subparts: sublists & subexpressions | 103
  8. Abstract reps w/ funcs | 107
  9. Abstract patterns w/ funcs | 134
  10. Funcs to collect > 1 value | 140

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))


(define lat?

  (lambda (l)
    (cond
      ((null? l) #t)
      ((atom? (car l)) (lat? (cdr l)))
      (else #f))))

(define multirember&co
  (lambda (a lat col)
    (cond
      ((null? lat)
       (col (quote()) (quote())))
      ((eq? (car lat) a)
       (multirember&co a
                       (cdr lat)
                       (lambda (newlat seen)
                         (col newlat
                              (cons (car lat) seen)))))
      (else
       (multirember&co a
                       (cdr lat)
                       (lambda (newlat seen)
                         (col (cons (car lat) newlat)
                              seen)))))))

(define a-friend
  (lambda (x y)
    (null? y)))

(multirember&co (quote tuna) (quote ()) a-friend)

(multirember&co (quote tuna) (quote (tuna)) a-friend)

(define last-friend
  (lambda (x y)
    (length x)))

(multirember&co (quote tuna) (quote (stawberries tuna and swordfish)) last-friend)