你能帮我解决一个关于嵌套列表的棘手作业吗?基本上只要谓词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)