4

如何使用该MAPCAR函数在 Common Lisp 中以非递归REMOVE-IF方式实现等效于,的函数?

4

1 回答 1

4

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

但是有相关的功能是可以的MAPCAN。如果你

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

那么您将根据需要获得一个包含不满足谓词的元素的列表。

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 回答