如何使用MAPCAR函数来实现一个等价于REMOVE-IF的函数,在Common中是非递归的?
发布于 2012-11-07 12:37:11
使用MAPCAR是不可能的,因为它总是返回与输入长度相同的列表(如果某些输入元素满足谓词,则需要更短的列表)。
但相关函数MAPCAN是可能的。如果你
X。X满足谓词,则替换(X)X不满足谓词,则替换NIL然后,您将有一个列表,其中包含不满足谓词的元素(根据需要)。
给定实现步骤1的函数,MAPCAN将组合这些操作。
示例:
(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)组合,以获得相同的结果:
(defun my-remove-if (pred lst)
(apply #'nconc (mapcar (list-if-not pred) lst)))https://stackoverflow.com/questions/13263594
复制相似问题