(define (reduce fn init lst) (do ((val init (fn (car rem) val)) ; accumulated value passed as second argument (rem lst (cdr rem))) ((null? rem) val))) (display (reduce + 0 '(1 2 3 4 5))) (newline) ; => 15 (display (reduce expt 2 '(3 4))) (newline) ; => 262144