У меня есть список с несколькими подсписками. Некоторые из них имеют элементы NIL, от которых мне нужно избавиться. Я могу использовать только основные функции (NOT, EQL, СВОД и т.д ..)Удалить все нули из списка с подсписками в LISP
(defun trgni (lista)
(cond
((null lista) nil)
((not (atom (car lista))) (cons (trgni (car lista)) (trgni (cdr lista))))
((eql nil (car lista)) (trgni (cdr lista)))
(t (cons (car lista) (trgni (cdr lista))))))
У меня есть одна проблема с моим кодом, и это происходит, когда у меня есть подсписок, который содержит только Нильс. Например:
(trgni '((NIL ((7))) (8 (9 (10 ((11))) 12)) (13 (NIL NIL))))
мой код дает мне:
((((7))) (8 (9 (10 ((11))) 12)) (13 NIL))
«подсписок, содержащий только нули». Помните, что NIL * - это пустой список, поэтому '((NIL ((7))))', например, совпадает с '((() ((7)))) '. –
@JoshuaTaylor Да, но проблема в том, что он должен быть напечатан как() вместо NIL, иначе он не будет действителен (правила из домашней работы). – Bonne
@Bonne В Common Lisp, 'NIL' и пустые круглые скобки'() 'являются двумя альтернативными печатными надписями для одного и того же: они ссылаются на символ под названием' 'NIL' 'в пакете' 'COMMON-LISP '' , (Возможно, у вас есть собственный 'NIL' в вашем собственном пакете, который не является символом COMMON-LISP :: NIL, это другая проблема). Нет никакой разницы в значении между '(NIL NIL)' и '(()())'. – Kaz