LISP处理讨厌的NILs

LISP处理讨厌的NILs,lisp,null,Lisp,Null,我有一个过滤函数,它过滤掉一个不满足函数f的列表x 例如,我调用过滤器“evenp”0 1 2 3并返回NIL 1 NIL 3。但这正是我的问题。我怎样才能回到13号 i、 问题就在这里:lambda a b cond null a b在我的cond中我没有t或else语句,所以它不应该就停在那里,不返回nil吗?如果cond null a b不满足,如何使它不返回任何内容,甚至不返回nil 非常感谢 基于此: (remove-if #'evenp '(0 1 2 3)) 基于此,将: (re

我有一个过滤函数,它过滤掉一个不满足函数f的列表x

例如,我调用过滤器“evenp”0 1 2 3并返回NIL 1 NIL 3。但这正是我的问题。我怎样才能回到13号

i、 问题就在这里:lambda a b cond null a b在我的cond中我没有t或else语句,所以它不应该就停在那里,不返回nil吗?如果cond null a b不满足,如何使它不返回任何内容,甚至不返回nil

非常感谢

基于此:

(remove-if #'evenp '(0 1 2 3))
基于此,将:

(remove-if #'evenp '(0 1 2 3))

忽略这篇文章提出的其他问题,我会说mapcar总是会为它映射的每件事情返回一些东西,所以你不能使用另一个mapcar来清除那里的零。这就是mapcar所做的-如果映射到多个列表,它会遍历一个或多个项目,就像您第二次尝试的mapcar那样,并收集对这些参数调用某些函数的结果

相反,在这种情况下,如果出于某种原因必须使用mapcar,并且不需要NILs,则可以使用删除功能,即删除nil mapcar


既然@stark的答案已经在上面发布了,我想说,remove if函数本质上就是您在这里试图实现的。这就是是否用于家庭作业的问题变得最为重要的地方。

忽略这篇文章提出的其他问题,我会说mapcar总是会为它映射的每件事情返回一些东西,所以你不能使用另一个mapcar来清理那里的零。这就是mapcar所做的-如果映射到多个列表,它会遍历一个或多个项目,就像您第二次尝试的mapcar那样,并收集对这些参数调用某些函数的结果

相反,在这种情况下,如果出于某种原因必须使用mapcar,并且不需要NILs,则可以使用删除功能,即删除nil mapcar


既然@stark的答案已经在上面发布了,我想说,remove if函数本质上就是您在这里试图实现的。这就是是否用于家庭作业的问题变得最为相关的地方。

要回答一个更一般的问题,即如何在结果中拼接任意数量的项目(从语义上讲,这些项目都没有),mapcar+append在这方面很有用:

(defun filter (f xs)
  (mapcan (lambda (x)
            (if (funcall f x)
                (list x)
                nil))
          xs))
如果要将项目映射到多个结果,则mapcan也很有用:

(defun multi-numbers (xs)
  (mapcan (lambda (x) (list x (+ x x) (* x x))) xs))

(multi-numbers (list 1 2 3))
;=> (1 2 1 2 4 4 3 6 9)

要回答一个更一般的问题,即如何将任意数量的项(包括所有项)拼接到结果中,这在语义上是mapcar+append,这一点非常有用:

(defun filter (f xs)
  (mapcan (lambda (x)
            (if (funcall f x)
                (list x)
                nil))
          xs))
如果要将项目映射到多个结果,则mapcan也很有用:

(defun multi-numbers (xs)
  (mapcan (lambda (x) (list x (+ x x) (* x x))) xs))

(multi-numbers (list 1 2 3))
;=> (1 2 1 2 4 4 3 6 9)
h是一个未定义的变量。你需要定义它。还有,这是家庭作业吗?怀疑h应该在一个小房间里;看起来海报试图将其用作中间存储,然后从中过滤出空值。h是一个未定义的变量。你需要定义它。还有,这是家庭作业吗?怀疑h应该在一个小房间里;看起来海报试图将其用作中间存储,然后从中过滤出空值。