Common Lisp的成语是什么:
删除列表中不满足谓词的元素 那些满足谓词的人会应用一个函数。
这是Common Lisp的成语:
mapcar applied to remove-if
答案 0 :(得分:7)
成语将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。&#34; 已被标记为已弃用的所有内容均可视为未弃用,因为它不会成为另一个标准。&#34;,{ {3}}。 子>