あなたのリストは適切なリストではなく、ドット リストです。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)
もちろん、そうでない場合は、最終的な値を独自のコンスに保持するか、ドロップすることで、ドットを適切な値に変換できます。
(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)