(defun mapcar (function-name the-list)
  (if the-list
    (cons
      (funcall function-name (first the-list))
      (mapcar function-name (rest the-list)))))

(defun maplist (function-name the-list)
  (cond
   ((null the-list) nil)
   (t (cons (funcall function-name the-list)
       (maplist function-name (rest the-list))))))

(defun append (list-one list-two)
  (append-tail (reverse list-one) list-two))

(defun append-tail (reversed-list list-two)
  (if (null reversed-list) list-two
    (recur (rest reversed-list) (cons (car reversed-list) list-two))))

(defun reverse (the-list)
  (reverse-tail () the-list))

(defun reverse-tail (accumulator the-list)
  (if (null the-list) accumulator
    (recur (cons (first the-list) accumulator) (rest the-list))))

(defun deep-reverse (the-list)
  (if the-list
    (append
      (deep-reverse (rest the-list))
      (list
        (if (listp (first the-list))
          (deep-reverse (first the-list))
          (first the-list))))))

(defun nth (n listA)
  (cond
   ((equal 0 n) (first listA))
   (t (nth (- n 1) (rest listA)))))
