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

Rog*_*llo 3 lisp idioms idiomatic common-lisp

Common Lisp的成语是什么:

删除列表中不满足谓词的元素以及满足谓词的元素应用函数.

这是Common Lisp的成语:

mapcar applied to remove-if
Run Code Online (Sandbox Code Playgroud)

cor*_*ump 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)))
Run Code Online (Sandbox Code Playgroud)

可能存在问题MAPCARREMOVE-IF-NOT的是,它是要分配内存的临时列表只是后丢弃.您可以将此称为过早优化,但如果我想使用高阶函数(例如,因为我想使用广义序列而不仅仅是列表),我会使用MAP-INTO:

(lambda (elements test function)
  (let ((tmp (remove-if-not test elements)))
    (map-into tmp function tmp)))
Run Code Online (Sandbox Code Playgroud)

1. " 所有被标记为已弃用的东西都可以被视为未弃用,因为不会有其他标准. ",R.Strandh(海滩).

  • +1提及未被充分认可的**地图**. (2认同)