Rog*_*llo 3 lisp idioms idiomatic common-lisp
Common Lisp的成语是什么:
删除列表中不满足谓词的元素以及满足谓词的元素应用函数.
这是Common Lisp的成语:
mapcar applied to remove-if
Run Code Online (Sandbox Code Playgroud)
成语将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)))
Run Code Online (Sandbox Code Playgroud)
可能存在问题MAPCAR了REMOVE-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(海滩).