問題 2.33

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


(define (map p sequence)
  (define (square x) (* x x))
  (accumulate (lambda (x y) (cons (p x) y)) null sequence))

(define (append seq1 seq2) 
  (accumulate cons seq2 seq1))

(define (length sequence)
  (accumulate (lambda (x y) (+ y 1)) 0 sequence))

(map square (list 1 2 3 4 5 6))
;-> (1 4 9 16 25 36)

(append (list 1 2 3) (list 4 5 6))
;-> (1 2 3 4 5 6)

(length (list 1 2 3 4 5 6))
;-> 6