Function 搜索项目的函数

Function 搜索项目的函数,function,common-lisp,built-in,Function,Common Lisp,Built In,公共Lisp中有许多序列(以及列表)函数,用于搜索与项目相关的给定序列或列表。例如,(定位项目序列)在给定序列中搜索与项目匹配的元素。获取项目的其他一些序列搜索功能包括查找,计数,删除,以及删除。类似的列表搜索功能包括pushnew、member、adjoin、assoc和rassoc 在每种情况下,一次只搜索一个项目。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将函数放入每个项目的循环中。缺点是序列或列表将针对每个项目进行新扫描 您可以编写自己的函数来扫描所有项的序列或

公共Lisp中有许多序列(以及列表)函数,用于搜索与项目相关的给定序列或列表。例如,
(定位项目序列)
在给定序列中搜索与项目匹配的元素。获取项目的其他一些序列搜索功能包括
查找
计数
删除
,以及
删除
。类似的列表搜索功能包括
pushnew
member
adjoin
assoc
rassoc

在每种情况下,一次只搜索一个项目。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将函数放入每个项目的循环中。缺点是序列或列表将针对每个项目进行新扫描


您可以编写自己的函数来扫描所有项的序列或列表一次,但这似乎或多或少重复了最初设计内置函数时所做的工作。我想知道为什么这些函数不是在更高的抽象层次上设计来接受多个项?一个项目的默认性能(和结果)不一样吗?

您要查找的是搜索功能的版本。 例如,要查找数据库中的所有青少年,您可以

(remove-if-not (lambda (age) (<= 13 age 19)) people :key #'person-age)

(如果没有则删除(lambda(age)(这就是为什么有:开始参数(主要用于向量);具有列表的成员函数允许您访问其余元素。或者,您可以使用“删除”来收集多个元素,这些元素接受与“查找”等相同的参数。唯一需要使用循环的情况是,如果您希望有效地收集列表中的所有位置。从这些位置,您可以始终构建更高级别的函数或我们是的。我想更好的方法是,大多数“item”函数提供带有谓词(or:test)的
-if
变体。然后,您可以通过一次扫描在谓词中选择所需的项。谢谢。