【发布时间】:2017-06-03 13:36:15
【问题描述】:
你能帮我解决一个关于嵌套列表的棘手作业吗? 基本上只要谓词 evenp 为 true ,我就应该从列表(或嵌套列表)中删除元素,保持整个列表的结构。
(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 为真时它不会删除元素并且它返回类似
的值((((5 .T ) .).).)
【问题讨论】:
-
(cdr l)是复制错误吗?不应该是(cdr list)吗? -
缩进改正后就可以看到问题了。您在
Symbolp行的末尾缺少),因此所有这些代码都被视为该案例的一部分。但这应该会导致错误,所以我怀疑这是另一个复制错误。贴出实际代码,适当缩进,否则我们无法判断真正的错误。 -
对符号的特殊处理在意识形态上似乎是错误的。我知道这是为了避免
(evenp S)&c 上的错误,但这仍然是错误的。 -
感谢您回答@sds,但我不明白您的意思,情况非常简单明了,如果列表中的元素是符号,那么我放入列表并检查下一个一、上cdr。相反,我不太确定它是否正确 (funcall f (car l)) ,据我所知,它将函数应用于 arg 。谢谢
-
@MaxMnt: 如果你的函数
f在符号上做了一些有趣的事情怎么办? (例如,检查他们的家庭包裹)您的nopred将不起作用。
标签: lisp common-lisp