Вы находитесь на правильном пути, но ваши два последних условия имеют одно и то же действие, которое должно указывать на то, что одно из них не выполняет то, что должно. На самом деле, второе условие, случай listp
, неверно, потому что, когда это список, вам нужно добавить реверс этого списка вместо неизмененного списка. Возможное решение:
(defun reverse (l)
(cond ((null? l) nil)
((listp (car l)) (append (reverse (cdr l))
(list (reverse (car l)))))
(t
(append (reverse (cdr l))
(list (car l))))))
> (reverse '((1 2 3) (4 5 6)))
((6 5 4) (3 2 1))
Как видите, единственное отличие состоит в том, что вы проверяете, является ли первый элемент списком, и если это так, вы переворачиваете первый элемент перед добавлением его.