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

时间:2017-01-19 00:35:13

标签: lisp common-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 ) .).).) 

1 个答案:

答案 0 :(得分:0)

您需要在NIL案例中返回(null list)。如果您在匹配的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)