这是我必须做的!我有很多列表,我必须返回没有整数的列表。
(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)
如何更正我的代码以获得我想要的输出?
答案 0 :(得分:4)
其中一个问题是
(if (not (integerp list)) list)
当nil
是整数时,会返回list
,因此您将整数替换为nil
。
我认为实现这一目标的唯一方法是假设没有人会在非列表值上调用你的函数。然后你可以用
形式重写它(defun functInt (x)
(cond ((atom x) x)
((integerp (car x)) FOO)
(t BAR)))
我将表达式替换为FOO
和BAR
作为练习。 (functInt 3)
仍将返回3
,但这违反了该函数的合同。
请注意(atom nil)
为真,因此您不需要(null x)
的特殊情况。
答案 1 :(得分:2)
不尝试在单个函数中完成所有这些操作可能会有所帮助,但是使用高阶函数来解决一般情况,然后只为特定情况填写一个非常简单的函数。这是一个合适的高阶函数:
(defun tree-mapcan (function tree)
(if (listp tree)
(list (mapcan (lambda (elt) (tree-mapcan function elt))
tree))
(funcall function tree)))