Common Lisp中有很多序列(以及列表)功能,它们可以针对某个项目搜索给定的序列或列表。例如,(position item sequence)
在给定序列中搜索与该项匹配的元素。带项目的其他一些序列搜索功能包括find
,count
,delete
和remove
。相似的列表搜索功能包括pushnew
,member
,adjoin
,assoc
和rassoc
。
在每种情况下,一次只搜索一项。但是,如果您想使用这些方便的内置函数搜索多个项目,最简单的方法可能是将每个项目的功能置于循环中。缺点是将对每个项目重新扫描序列或列表。
您可以编写自己的函数来扫描所有项目的序列或列表一次,但这似乎或多或少地重复了最初设计内置函数的工作。我想知道为什么这些功能不是在较高的抽象层次上设计才能采用多个项目?一项的默认性能(和结果)会不会相同?
答案 0 :(得分:2)
您正在寻找的是-if
and -if-not
版本的搜索功能。
例如,要查找数据库中的所有青少年,您可以
(remove-if-not (lambda (age) (<= 13 age 19)) people :key #'person-age)