搜索项目的功能
Functions that Search for Items
Common Lisp 中有许多序列(以及列表)函数可以搜索与项目相关的给定序列或列表。例如,(position item sequence)
在给定序列中搜索与项目匹配的元素。其他一些采用项目的序列搜索函数包括 find
、count
、delete
和 remove
。类似的列表搜索功能还有pushnew
、member
、adjoin
、assoc
、rassoc
.
在每种情况下,一次只搜索一项。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将函数放入每个项目的循环中。缺点是每一项都会重新扫描序列或列表。
您可以编写自己的函数来为所有项目扫描一次序列或列表,但这似乎或多或少地重复了最初设计内置函数的工作。我想知道为什么这些函数没有设计在更高的抽象层次上以获取多个项目?一个项目的默认性能(和结果)不会相同吗?
您正在寻找的是 -if
and -if-not
版本的搜索功能。
例如,要在您的数据库中找到所有青少年,您可以这样做
(remove-if-not (lambda (age) (<= 13 age 19)) people :key #'person-age)
Common Lisp 中有许多序列(以及列表)函数可以搜索与项目相关的给定序列或列表。例如,(position item sequence)
在给定序列中搜索与项目匹配的元素。其他一些采用项目的序列搜索函数包括 find
、count
、delete
和 remove
。类似的列表搜索功能还有pushnew
、member
、adjoin
、assoc
、rassoc
.
在每种情况下,一次只搜索一项。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将函数放入每个项目的循环中。缺点是每一项都会重新扫描序列或列表。
您可以编写自己的函数来为所有项目扫描一次序列或列表,但这似乎或多或少地重复了最初设计内置函数的工作。我想知道为什么这些函数没有设计在更高的抽象层次上以获取多个项目?一个项目的默认性能(和结果)不会相同吗?
您正在寻找的是 -if
and -if-not
版本的搜索功能。
例如,要在您的数据库中找到所有青少年,您可以这样做
(remove-if-not (lambda (age) (<= 13 age 19)) people :key #'person-age)