Две вещи: во-первых, remove
- это предопределенная функция в пакете CL, поэтому я настоятельно рекомендую использовать другое имя, скажем, my-remove
. Во-вторых, вы тестируете длину l
вместо подсписка (car l)
, который вы хотите исключить. Правильная форма будет:
(defun my-remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length (car l)) 1)) (my-remove (cdr l)))
((atom (car l)) (cons (car l) (my-remove (cdr l))))
(T (cons (my-remove (car l)) (my-remove (cdr l))))
))