如何使用该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 回答