2016-04-06 6 views
1

複数のサブリストを持つリストがあります。それらの中には、取り除く必要のある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)) 
+0

"NILだけを含むサブリスト" NIL *は空リストなので、 '((NIL((7)))')は '((((7)))'と同じです。 )))) ')。 –

+0

@JoshuaTaylorはい、問題は、NILの代わりに()として印刷しなければならないということです。そうでなければ、それは有効ではありません(宿題のルール)。 – Bonne

+0

@Bonne Common Lispでは、 'NIL'と空の括弧'() 'はまったく同じものの2つの代替綴りです:' 'COMMON-LISP' 'パッケージの' 'NIL ''というシンボルを参照します。 (自分のパッケージに自分の 'NIL'を置くことは可能です。これは' COMMON-LISP :: NIL'のシンボルではなく、別の問題です)。 '(NIL NIL)'と '(()())'の間には意味に違いはありません。 – Kaz

答えて

1

the hyperspec()によると、それはCLが唯一の表記を使用するとまったく同じオブジェクトだがあるため、シンボルnilを書くためだけの代替表記でそれを印刷するとき。特定のインプリメンテーションで構成可能なフィーチャとして使用されていないかぎり、代替表記にはなりません。

処理中にcarを処理すると、結果が空であるかどうかを確認する必要があります。このような何か:

(let ((a (trgni (car lista)))) 
    (if (null a) 
     (trgni (cdr lista))   ; don't include this null value 
     (cons a (trgni (cdr lista))))) ; include since it's not null 

'(1 (nil nil nil) 2)のようなネストされたリストについては、この唯一の作品は(1 2)になるべきであることに注意してくださいが、何の引数が(nil nil nil)ありますか?次にそれを評価するためにnil以外の妥当な値はありません。nilは空のリストです。

関連する問題