2017-01-19 15 views
1

入れ子リストについての難しい宿題を解決するのに手伝ってください。 基本的には、述語のevenpが真であるときは、リスト全体の構造を維持しながら、リスト(または入れ子になったリスト)から要素を削除する必要があります。入れ子リストから要素を削除する方法lisp

(Nopred 'evenp '(1 S d ((4)) (7) ((((8)))) u)) 

これは、これは私が、私はこのコードで解決しようとしたが、それは動作しません

(Defun nopred (f list) 
    (Cond ((null list)) 
     ((Symbolp (car list)) (cons (car list) (nopred f (cdr list))) 
     ((Listp (car list)) (cons (nopred f (car list)) (nopred f (cdr list)))) 
     ((Funcall f (car list)) (nopred f (cdr list))) 
     (T (cons (car list) (nopred f (cdr list)))))) 

を書いた関数であり、それは要素を削除しません

(1 S d (()) (7) (((()))) u) 

を返す必要がありますevenpがtrueの場合、値は

((((5 .T) .).).) 
+0

は '(CDRリットル)'コピーエラー:私は、正しい結果を得るこれらの補正で

(defun nopred (f list) (cond ((null list) nil) ((symbolp (car list)) (cons (car list) (nopred f (cdr list)))) ((listp (car list)) (cons (nopred f (car list)) (nopred f (cdr list)))) ((funcall f (car list)) (nopred f (cdr list))) (t (cons (car list) (nopred f (cdr list)))))) 

? '(cdr list)'ではないでしょうか? – Barmar

+0

インデントが修正されると、問題が確認できます。 'Symbolp'行の最後に') 'がないので、そのコードはすべてこのケースの一部として扱われます。しかし、それはエラーを引き起こすはずなので、別のコピーエラーだと思う。適切なインデントで実際のコードを投稿してください。そうでなければ、何が本当に間違っているかはわかりません。 – Barmar

+0

シンボルの特別扱いは理想的に間違っているようです。私はこれが '(evenp S)'&cのエラーを避けることだと理解していますが、これはまだ間違っています。 – sds

答えて

0

(null list)ケースにNILを返す必要があります。一致するCOND句に戻り値がない場合は、条件の値を返し、(null list)Tを返します。

また、投稿コードにいくつかのタイプミスがありました:(cdr l)(cdr list)である必要があり、その行の末尾には)がありませんでした。

(1 S d (nil) (7) (((nil))) u) 
+0

答えに@barmarをくれてありがとうございました。おそらくコードをコピーする間違いがいくつかありました。 (スマートフォンを使ってコードを書くのはそれほど快適ではない)。とにかく、cond(il list)nilを書くと、predicate evenpが真になったら空のリストを取得するのではなく、(nil)と(((nil)))を最終的な結果として与えるだろうと思ったこのようなもの(1 S d()(7)((()))u)。もう一つの質問は、正しいことです(funcall f(arg))、私がfuncallを理解するまでは、fをargに適用します。前もって感謝します。 – MaxMnt

+0

@MaxMnt '()'と 'nil'は同じオブジェクトを書く異なる方法です。そして、replプリンタはそれを一方向にしか印刷しません。 ''(t nil xy) 'や空リスト' '(t()xy)'などのネストリストを望むかもしれませんが、これらは 'equal'の点で同じです:'(equal '(t nil xy)'(t()xy)); ==> t' – Sylwester

+0

@Sylwesterええ、私はあなたが言ったことに完全に同意します。この場合、結果はNilの代わりにこの表現 - >()でなければなりません。 出力は - >(1(3)d(()))) 私はNilをcons( ')またはappend'(() ')に置き換えようとしましたが、うまくいきません。 実際これは大学での私の次のLisp試験の質問の一種なので、私はこの無駄を「無」で解決する方法を探しています。ありがとう。 – MaxMnt

関連する問題