問題 2.39

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

(define fold-right accumulate)

(define (fold-left op initial sequence)
  (define (iter result rest)
    (if (null? rest)
        result
        (iter (op result (car rest))
              (cdr rest))))
  (iter initial sequence))

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

;;
(define (reverse sequence)
  (fold-right (lambda (x y) (append y (list x))) null sequence))

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

;;
(define (reverse sequence)
  (fold-left (lambda (x y) (cons y x)) null sequence))

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

;ok一発
;簡単。