Skip to content

2.33

; Fill in the missing expressions to complete the following definitions of some basic
; list-manipulation operations as accumulations:
;
; (define (map p sequence)
;   (accumulate (lambda (x y) <??>) nil sequence))
; (define (append seq1 seq1)
;   (accumulate cons <??> <??>))
; (define (length sequence)
;   (accumulate <??> 0 sequence))

(define nil '())
(define (accumulate op initial sequence)
    (if (null? sequence) 
        initial
        (op (car sequence) (accumulate op initial (cdr sequence)))))

(define (map p sequence)
    (accumulate 
        (lambda (x y) (cons (p x) y))
        nil
        sequence))
(map square (list 1 2 3 4)) ; (1 4 9 16)

(define (append seq1 seq2)
    (accumulate cons seq2 seq1))
(append (list 1 2 3 4) (list 5 6 7 8)) ; (1 2 3 4 5 6 7 8)

(define (length sequence)
    (accumulate (lambda (x y) (+ 1 y)) 0 sequence))
(length (list 1 2 3 5)) ;Value: 4