【问题标题】:Functions that Search for Items搜索项目的功能
【发布时间】:2019-05-18 22:49:22
【问题描述】:

Common Lisp 中有许多序列(也包括列表)函数可以搜索给定序列或列表中的某个项目。例如,(position item sequence) 在给定序列中搜索与该项目匹配的元素。其他一些获取项目的序列搜索功能包括findcountdeleteremove。类似的列表搜索功能包括pushnewmemberadjoinassocrassoc

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

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

【问题讨论】:

  • 这就是为什么你有 :start 参数(主要用于向量);带有列表的成员函数允许您访问其余元素。或者您可以使用 remove 来收集多个接受与 find 等相同参数的元素。您必须使用循环的唯一情况是如果您想有效地收集列表中的所有位置。从中您可以随时构建更高级别的函数或使用库。
  • 对。我想一个更好的方式来看待这个问题是大多数“item”函数都提供-if 带有谓词(或:test)的变体。然后,您可以通过一次扫描在谓词中挑选出您想要的项目。谢谢。

标签: function common-lisp built-in


【解决方案1】:

您正在寻找的是-if and -if-not 版本的搜索功能。 例如,要查找数据库中的所有青少年,您可以这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多