2011-12-30 112 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)))