我正在使用方案 R5RS。
给定一个包含多个条目的列表,我想返回该列表直到最后一次出现给定元素。
所以对于以下输入:
一个列表'("hi" "how" "are" "you")
关键字"you"
我想要以下输出:
列表'("hi" "how" "are")
我在方案 R5RS 中找不到具有此功能的功能,但也许我遗漏了一些东西。如果不存在这样的功能,我将如何实现它?
这比乍一看要复杂一些,但这应该可行:
(define (last lst key)
(cond ((null? lst) '())
((member key (cdr lst))
(cons (car lst) (last (cdr lst) key)))
(else '())))
关键的见解是您应该使用member
来检查该元素是否仍然存在于列表中(这将告诉我们何时找到它的最后一次出现)。您还应该考虑两种特殊情况 - 如果列表为空或键不在列表中会发生什么?在这两种情况下,我都会返回一个空列表。例如:
(last '("hi" "how" "are" "you") "you")
=> '("hi" "how" "are")
(last '("hi" "how" "are" "how" "you") "how")
=> '("hi" "how" "are")
(last '("hi" "how" "are" "how" "you") "today")
=> '()
(last '() "empty")
=> '()
如果您反转列表然后查找第一次出现,这可以非常简洁地完成:
(define (last lst key)
(define r (member key (reverse lst)))
(if r
(reverse (cdr r))
'()))