Common Lisp习惯用于过滤列表并将函数应用于未过滤的元素?

时间:2016-04-14 21:45:07

标签: lisp common-lisp idioms idiomatic

Common Lisp的成语是什么:

  

删除列表中不满足谓词的元素   那些满足谓词的人会应用一个函数。

这是Common Lisp的成语:

mapcar applied to remove-if

1 个答案:

答案 0 :(得分:7)

成语将MAPCAR超过REMOVE-IF-NOT,因为您希望保留与谓词匹配的元素。 -IF-NOT函数根据标准被弃用,但对于Common Lisp,弃用大多是无意义的 1 ,因此我们很少看到有人使用COMPLEMENTREMOVE-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}}。