首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MAPCAR实现删除-IF

如何使用MAPCAR实现删除-IF
EN

Stack Overflow用户
提问于 2012-11-07 05:26:18
回答 1查看 1.5K关注 0票数 4

如何使用MAPCAR函数来实现一个等价于REMOVE-IF的函数,在Common中是非递归的?

EN

回答 1

Stack Overflow用户

发布于 2012-11-07 12:37:11

使用MAPCAR是不可能的,因为它总是返回与输入长度相同的列表(如果某些输入元素满足谓词,则需要更短的列表)。

但相关函数MAPCAN是可能的。如果你

  1. 将谓词应用于每个元素X
    • 如果X满足谓词,则替换(X)
    • 如果X不满足谓词,则替换NIL

  1. 将结果列表连接起来

然后,您将有一个列表,其中包含不满足谓词的元素(根据需要)。

给定实现步骤1的函数,MAPCAN将组合这些操作。

示例:

代码语言:javascript
复制
(defun list-if-not (pred)
  (lambda (x) (if (funcall pred x) nil (list x))))

(defun my-remove-if (pred lst)
  (mapcan (list-if-not pred) lst))

(my-remove-if #'evenp '(1 2 3 4 5))

==> (1 3 5)

单靠MAPCAR无法做到这一点,尽管您可以将其与NCONC (或APPEND)组合,以获得相同的结果:

代码语言:javascript
复制
(defun my-remove-if (pred lst)
  (apply #'nconc (mapcar (list-if-not pred) lst)))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13263594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档