Вы находитесь на правильном пути, но ваши последние два условия имеют одно и то же действие, которое должно указывать на то, что один из них не делает то, что должен. В самом деле, второе условие, 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))
Как вы можете видеть, единственное отличие состоит в том, что вы проверить, если первый элемент списка, и если да, то вы реверс первый элемент перед добавлением его.
немного короче: (DEFUN мой обратного хода (L) (если (null l) nil (прилагается (мой-реверс (cdr l)) (список (если (списокp (машина l)) (мой-реверс (машина l)) (машина l)))))) – jlf