2011-12-30 12 views
-1

これは私がする必要があります!私は多くのリストを持っており、整数なし​​でリストを返す必要があります。LISP LISTで1つの解答を解決するにはいくつかの助けが必要です

(functInt '(f 3 (v) (((7))) n())) 

-------->

(f (v) ((())) n()) 

これは私のコードです:

(defun functInt (list) 
    (cond ((atom list) (if (not(integerp list)) list)) 
     ((null (cdr list)) (functInt (car list))) 
     (T (cons (functInt (car list)) (functInt (cdr list)))))) 

しかし、私が得ることは、私が取得するための私のコードを修正するにはどうすればよい(F NIL V NIL N) です私が望む出力? listが整数であるので、あなたはnilと整数を交換しているとき

答えて

4

問題の一つは、その

(if (not (integerp list)) list) 

戻りnilです。

私はこの権利を得るための唯一の方法は、誰もあなたの関数を非リスト値で呼び出すことはないと仮定することだと思います。そして、あなたは私が演習としてFOOBARの代わりに式を残す形

(defun functInt (x) 
    (cond ((atom x) x) 
     ((integerp (car x)) FOO) 
     (t BAR))) 

でそれを書き換えることができます。 (functInt 3)はまだ3を返しますが、その機能の契約に違反します。

​​が真であるため、(null x)の特殊なケースは必要ありません。

2

これをすべて1つの関数で行うのではなく、上位の関数を使用して一般的なケースを解いてから、特定のケースに対して非常に簡単な関数を入力すると便利です。これは適切な高次関数の1つです:

(defun tree-mapcan (function tree) 
    (if (listp tree) 
     (list (mapcan (lambda (elt) (tree-mapcan function elt)) 
        tree)) 
     (funcall function tree))) 
関連する問題