2011-12-30 52 views
-1

這是我必須做的!我有很多列表,我必須返回沒有整數的列表。LISP需要一些幫助來解決一個exsercise與LIST

(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) 我怎樣才能更正我的代碼來獲得我想要的輸出?

回答

4

其中的一個問題是,

(if (not (integerp list)) list) 

回報nillist是一個整數,所以你與nil更換整數。

我認爲獲得這個權利的唯一方法是假定沒有人會在非列表值上調用你的函數。然後你就可以在表單

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

,我離開了表達式代替FOOBAR作爲練習重寫。 (functInt 3)仍然會返回3,但這違反了該函數的合約。

請注意,​​是正確的,因此您不需要(null x)的特殊情況。

2

不嘗試在單個函數中完成所有這些操作可能會有所幫助,但可以使用高階函數來解決一般情況,然後僅爲特定情況填充非常簡單的函數。這是一個合適的高階功能:

(defun tree-mapcan (function tree) 
    (if (listp tree) 
     (list (mapcan (lambda (elt) (tree-mapcan function elt)) 
        tree)) 
     (funcall function tree)))