【发布时间】:2016-04-14 21:45:07
【问题描述】:
Common Lisp 的成语是什么:
删除列表中不满足谓词和 for 的元素 那些满足谓词的应用函数。
这是 Common Lisp 的成语吗:
mapcar applied to remove-if
【问题讨论】:
-
是的,它是 mapcar over remove-if
标签: lisp common-lisp idioms
Common Lisp 的成语是什么:
删除列表中不满足谓词和 for 的元素 那些满足谓词的应用函数。
这是 Common Lisp 的成语吗:
mapcar applied to remove-if
【问题讨论】:
标签: lisp common-lisp idioms
成语应该是MAPCAR 而不是REMOVE-IF-NOT,因为您希望保留与谓词匹配的元素。 -IF-NOT 函数根据标准已被弃用,但对于 Common Lisp 而言,弃用几乎没有意义1,因此我们很少看到有人将COMPLEMENT 与REMOVE-IF 一起使用.
但是大多数人会在这里使用LOOP:
(lambda (elements test function)
(loop
for e in elements
when (funcall test e)
collect (funcall function e)))
MAPCAR 相对于REMOVE-IF-NOT 的一个可能问题是它会为临时列表分配内存,然后将其丢弃。你可以称之为过早优化,但如果我想使用高阶函数(例如,因为我想使用广义序列而不仅仅是列表),我会使用MAP-INTO:
(lambda (elements test function)
(let ((tmp (remove-if-not test elements)))
(map-into tmp function tmp)))
1. "所有被标记为弃用的东西都可以被认为是未弃用的,因为不会有另一个标准。", R. Strandh (beach) .
【讨论】: