#lang sicp (define (unique s) (if (null? s) nil (cons (car s) (unique (filter (lambfa (x) (not (eq? x (car s)))) (cdr s))) ) ) )
这是一个Scheme函数,名为unique
,它接受一个参数s
,并返回一个去除s
中重复元素后的新列表。
函数体的主要部分是递归的,它使用filter
函数从列表s
中过滤出不等于s
的第一个元素的其余元素,并将它们传递给unique
函数,直到列表s
为空,此时返回空列表。
具体来说,这个函数做了以下几件事:
- 如果列表
s
为空,返回空列表。 - 否则,使用
car
函数获取列表s
的第一个元素,并将其与由unique
递归调用返回的不包含列表中第一个元素的重复元素的新列表连接起来。 - 在递归调用
unique
时,使用filter
函数和一个lambda表达式来过滤掉列表s
中不等于s
的第一个元素的其余元素,以便构建新列表。
(lambda (x) (not (eq? x (car s))))
它接受一个参数x
,并返回一个布尔值,表示参数x
是否等于s
的第一个元素。具体来说,该lambda表达式做了以下几件事情:
- 使用
car
函数获取s
的第一个元素,并将其与参数x
进行比较。 - 如果它们相等,则返回
#f
,表示参数x
与s
的第一个元素相同。 - 否则,返回
#t
,表示参数x
与s
的第一个元素不同。
这个lambda表达式的作用是在过滤器函数中使用,它用于测试序列中的每个元素,以查看是否应该包含在结果序列中。在本例中,它用于过滤掉与列表s
的第一个元素相同的元素。
(filter <pred> <lst>)
Returns a list consisting of only the elements of lst
that return true when called on pred
(a one-argument procedure).