(defun my-reverse-1 (l)
  (let ((x (car l))
        (xs (cdr l)))
    (cond ((consp x) (my-reverse-1 (cons (cdr x) (cons (car x) xs))))
          ((null x) xs)
          (t (my-reverse-1 (cons xs (cons x nil)))))))

(defun my-reverse-2 (l)
  (my-reverse-2-aux l nil))

(defun my-reverse-2-aux (l a)
  (if (null l)
      a
    (my-reverse-2-aux (rest l) (cons (first l) a))))

;; CL-USER> (my-reverse-1 (list 1 2 3 4))
;;   0: (MY-REVERSE-1 (1 2 3 4))
;;     1: (MY-REVERSE-1 ((2 3 4) 1))
;;       2: (MY-REVERSE-1 ((3 4) 2 1))
;;         3: (MY-REVERSE-1 ((4) 3 2 1))
;;           4: (MY-REVERSE-1 (NIL 4 3 2 1))
;;           4: MY-REVERSE-1 returned (4 3 2 1)
;;         3: MY-REVERSE-1 returned (4 3 2 1)
;;       2: MY-REVERSE-1 returned (4 3 2 1)
;;     1: MY-REVERSE-1 returned (4 3 2 1)
;;   0: MY-REVERSE-1 returned (4 3 2 1)
;; (4 3 2 1)
;; CL-USER> (my-reverse-2 (list 1 2 3 4))
;;   0: (MY-REVERSE-2 (1 2 3 4))
;;     1: (MY-REVERSE-2-AUX (1 2 3 4) NIL)
;;       2: (MY-REVERSE-2-AUX (2 3 4) (1))
;;         3: (MY-REVERSE-2-AUX (3 4) (2 1))
;;           4: (MY-REVERSE-2-AUX (4) (3 2 1))
;;             5: (MY-REVERSE-2-AUX NIL (4 3 2 1))
;;             5: MY-REVERSE-2-AUX returned (4 3 2 1)
;;           4: MY-REVERSE-2-AUX returned (4 3 2 1)
;;         3: MY-REVERSE-2-AUX returned (4 3 2 1)
;;       2: MY-REVERSE-2-AUX returned (4 3 2 1)
;;     1: MY-REVERSE-2-AUX returned (4 3 2 1)
;;   0: MY-REVERSE-2 returned (4 3 2 1)
;; (4 3 2 1)