【发布时间】:2019-05-18 22:49:22
【问题描述】:
Common Lisp 中有许多序列(也包括列表)函数可以搜索给定序列或列表中的某个项目。例如,(position item sequence) 在给定序列中搜索与该项目匹配的元素。其他一些获取项目的序列搜索功能包括find、count、delete 和remove。类似的列表搜索功能包括pushnew、member、adjoin、assoc和rassoc。
在每种情况下,一次只搜索一个项目。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将函数放入每个项目的循环中。缺点是每个项目都会重新扫描序列或列表。
您可以编写自己的函数来扫描所有项目的序列或列表一次,但这似乎或多或少地重复了最初设计内置函数的工作。我想知道为什么这些函数没有设计在更高的抽象层次上来获取多个项目?一项的默认性能(和结果)会不会相同?
【问题讨论】:
-
这就是为什么你有 :start 参数(主要用于向量);带有列表的成员函数允许您访问其余元素。或者您可以使用 remove 来收集多个接受与 find 等相同参数的元素。您必须使用循环的唯一情况是如果您想有效地收集列表中的所有位置。从中您可以随时构建更高级别的函数或使用库。
-
对。我想一个更好的方式来看待这个问题是大多数“item”函数都提供
-if带有谓词(或:test)的变体。然后,您可以通过一次扫描在谓词中挑选出您想要的项目。谢谢。
标签: function common-lisp built-in