複数のサブリストを持つリストがあります。それらの中には、取り除く必要のあるNIL要素があります。私は基本機能のみを使用することができます(NOT、EQL、CONS等。)LISP内のサブリストを持つリストからすべてのnilを削除します。
(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))))))
私は自分のコードを持つ一つの問題を持っていると私は唯一のNILSが含まれているサブリストを持っているときに起こります。たとえば:
(trgni '((NIL ((7))) (8 (9 (10 ((11))) 12)) (13 (NIL NIL))))
私のコードは私に与える:
((((7))) (8 (9 (10 ((11))) 12)) (13 NIL))
"NILだけを含むサブリスト" NIL *は空リストなので、 '((NIL((7)))')は '((((7)))'と同じです。 )))) ')。 –
@JoshuaTaylorはい、問題は、NILの代わりに()として印刷しなければならないということです。そうでなければ、それは有効ではありません(宿題のルール)。 – Bonne
@Bonne Common Lispでは、 'NIL'と空の括弧'() 'はまったく同じものの2つの代替綴りです:' 'COMMON-LISP' 'パッケージの' 'NIL ''というシンボルを参照します。 (自分のパッケージに自分の 'NIL'を置くことは可能です。これは' COMMON-LISP :: NIL'のシンボルではなく、別の問題です)。 '(NIL NIL)'と '(()())'の間には意味に違いはありません。 – Kaz