您的错误是您缺少操作员,也许cons
. 如果你看结果:
((cdr (car list1))(second (cdr list1)))
因此,Scheme 期望 (cdr (car list)) 是一个过程,因为它在表单中的操作员位置,但因为它不是你得到一个错误。此外(cdr (car x))
==cdar
不会取每个元素中的第二个元素,而是每个元素的尾部。cadar
是你正在寻找的。
(define (second list1)00+
(if (null? (cdr list1))
(cons (cadar list1) '())
(cons (cadar list1) (second (cdr list1)))))
空列表将失败。为了解决这个问题,你让 consequemt 处理每个元素,并且只停止基本情况:
(define (second list1)
(if (null? list1)
'()
(cons (cadar list1) (second (cdr list1)))))
列表的结果将是相同的。有一个过程叫做map。它支持多个列表参数,但其中一个的实现是:
(define (map fun lst)
(if (null? lst)
'()
(cons (fun (car lst)) (map fun (cdr lst)))))
看起来很熟悉?两者都根据每个元素制作一个列表,但map
都是通用的。因此我们应该尝试(fun (car lst))
做同样的事情(cadar lst)
。
(define (second lst)
(map cadr lst)) ; (cadr (car x)) == (cadar x)
你有它。克里斯打败了我,但我想评论使用缩写的其他答案之一second
。它在球拍/基地和库 SRFI-1 中定义,但在最后的方案报告中没有提到。即,某些实现可能需要导入额外的库才能使其工作。