如何使用该MAPCAR
函数在 Common Lisp 中以非递归REMOVE-IF
方式实现等效于,的函数?
问问题
1442 次
1 回答
4
不可能MAPCAR
,因为它总是返回与输入长度相同的列表(如果某些输入元素满足谓词,则您需要更短的列表。)
但是有相关的功能是可以的MAPCAN
。如果你
- 将谓词应用于每个元素
X
。- 如果
X
满足谓词,则替换(X)
- 如果
X
不满足谓词,则替换NIL
- 如果
- 连接结果列表
那么您将根据需要获得一个包含不满足谓词的元素的列表。
MAPCAN
将结合这些操作,给定一个实现步骤 #1 的函数。
例子:
(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
(or APPEND
) 组合以获得相同的结果:
(defun my-remove-if (pred lst)
(apply #'nconc (mapcar (list-if-not pred) lst)))
于 2012-11-07T12:37:11.230 回答