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

如何从嵌套列表lisp中删除元素,lisp,common-lisp,Lisp,Common Lisp,你能帮我解决一个关于嵌套列表的棘手的家庭作业吗? 基本上,只要谓词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 (ca

你能帮我解决一个关于嵌套列表的棘手的家庭作业吗? 基本上,只要谓词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为true时,它不会删除元素,并且返回如下值

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

您需要在
(空列表)
案例中返回
NIL
。当匹配的
COND
子句中没有返回值时,它返回条件的值,
(空列表)
返回
t

您在发布的代码中也有一些输入错误:
(cdr l)
应该是
(cdr列表)
,并且在该行末尾缺少一个

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

您需要在
(空列表)
案例中返回
NIL
。当匹配的
COND
子句中没有返回值时,它返回条件的值,
(空列表)
返回
t

您在发布的代码中也有一些输入错误:
(cdr l)
应该是
(cdr列表)
,并且在该行末尾缺少一个

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

(cdr l)
是复制错误吗?是否应该是
(cdr列表)
?当缩进被纠正时,您可以看到问题。在
Symbolp
行的末尾缺少一个
,因此所有代码都被视为该情况的一部分。但这应该会导致错误,所以我怀疑这是另一个复制错误。用适当的缩进贴出实际的代码,否则我们就看不出真正的错误。对符号的特殊处理在意识形态上似乎是错误的。我明白这是为了避免
(evenp S)
&c上的错误,但这仍然是错误的。感谢您回答@sds,但我不明白您的意思,情况非常简单和明显,如果列表中的元素是一个符号,那么我将放入列表并检查下一个,继续cdr。相反,我不太确定它是否正确(funcall f(car l)),据我所知,它将函数应用于arg。Thanks@MaxMnt:如果函数
f
在符号上做了一些有趣的事情,该怎么办?(例如,检查他们的家庭套餐)您的
nopred
无法工作。
(cdr l)
是复制错误吗?是否应该是
(cdr列表)
?当缩进被纠正时,您可以看到问题。在
Symbolp
行的末尾缺少一个
,因此所有代码都被视为该情况的一部分。但这应该会导致错误,所以我怀疑这是另一个复制错误。用适当的缩进贴出实际的代码,否则我们就看不出真正的错误。对符号的特殊处理在意识形态上似乎是错误的。我明白这是为了避免
(evenp S)
&c上的错误,但这仍然是错误的。感谢您回答@sds,但我不明白您的意思,情况非常简单和明显,如果列表中的元素是一个符号,那么我将放入列表并检查下一个,继续cdr。相反,我不太确定它是否正确(funcall f(car l)),据我所知,它将函数应用于arg。Thanks@MaxMnt:如果函数
f
在符号上做了一些有趣的事情,该怎么办?(例如,检查他们的家庭套餐)您的
nopred
将无法工作。感谢@barmar的回答,可能是我在复制代码时犯了一些错误。(使用智能手机编写代码并不太舒服)。无论如何,我认为编写cond((null list)nil)将给出(nil)和((nil)),作为最终结果,这是不正确的,而不是在谓词evenp为真时,我应该得到空列表,所以类似于(1sd()(7)(())u)。另一个问题,它是否正确(funcall f(arg)),据我所知,funcall将f应用于arg。提前谢谢。@MaxMnt
()
nil
只是写入同一对象的不同方式,而repl打印机只能以一种方式打印。您可能需要一个符号列表,如
”(t nil x y)
,或者您需要嵌套列表,其中一些是空的
”(t()x y)
,但是它们在
相等方面是相同的:
(相等)(t nil x y);=>是的,我完全同意你说的。但是在这种情况下,结果必须是这个表示->(),而不是Nil。所以输出应该是->(1()3d((()))我试图用cons'(')或append'(()')替换Nil,但它不起作用。实际上,这是我在大学的下一次Lisp考试的一种问题,因此我正在寻找一种用“nil”来解决这个问题的方法。谢谢。@MaxMnt没问题。打印机显示
nil
而不是
()
nil
,只要您使用结构,它就会这样显示。您可以创建结构的字符串表示形式或您自己的打印函数,将
nil
打印为
()
,但这只是事物的可视化方式,不会真正改变这样一个事实,即不这样做的结果是正确的。如果您使用对作为二叉树结构,并希望它显示为
((leaf.leaf)。(leaf.leaf))
,标准打印机将始终显示为
((leaf.leaf)leaf.leaf)
@sylvester是的,我明白您的意思。事实上,如果是我的话,我会让代码保持现在的状态。但由于测试是通过考试的最低要求之一,所以我仍然需要找到输出的解决方案。问题是,所有的东西都必须在一个函数中,所以打印不会有太多的工作,并且打印的结果是I(列表)和nil。C