(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)