如何从嵌套列表 LISP 中删除元素



你能帮我解决一个关于嵌套列表的棘手作业吗?基本上只要谓词evenp为真,我应该从列表(或嵌套列表中)中删除元素,保持整个列表的结构。

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

它应该返回

(1 S d (()) (7) (((()))) 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))))))

我试图用这段代码解决,但它不起作用,当 evenp 为 true 时它不会删除元素,并且它返回的值如下

((((5 .T ) .).).) 

(null list)的情况下,您需要返回NIL。当匹配的 COND 子句中没有返回值时,它将返回条件的值,(null list)返回 T

您在发布的代码中也有一些错别字:(cdr l)应该被(cdr list),并且该行末尾缺少)

(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))))))

通过这些更正,我得到了正确的结果:

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

最新更新