您的列表不是一个正确的列表,而是一个虚线列表。所有高阶函数,如filter
, fold
, map
, ... 都要求列表正确,因此不能使用此类列表。
我想知道您被此类列表困住的原因是否是因为生成该列表的过程中存在错误。通常如果你有一个递归过程..
(define (list-add1 lst)
(if (pair? lst)
(cons (add1 (car lst)) (list-add1 (cdr lst)))))
现在,每个计划者都会立即看到这与以下内容相同:
(define (list-add1 lst)
(if (pair? lst)
(cons (add1 (car lst)) (list-add1 (cdr lst)))
'UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE))
并且在使用时,您会将正确的列表更改为虚线列表:
(list-add1 '(1 2 3)) ; ==> (2 3 4 . UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE)
解决方法是修改使虚线列表处理if
. 例如。
(define (list-add1 lst)
(if (pair? lst)
(cons (add1 (car lst)) (list-add1 (cdr lst)))
'()))
(list-add1 '(1 2 3)) ; ==> (2 3 4)
当然,如果不是这种情况,您可以通过将最终值保留在其自身的缺点中或删除它来将 dotted 转换为正确的:
(define (dotted->proper lst keep-value)
(cond ((pair? lst) (cons (car lst) (dotted->proper (cdr lst) keep-value)))
((null? lst) '())
(keep-value (cons lst '()))
(else '())))
(dotted->proper '(1 2 . 3) #f) ; ==> (1 2)
(dotted->proper '(1 2 . 3) #t) ; ==> (1 2 3)