(define reduce ;; aka fold, fold-right, accumulate ....
  (lambda (proc init items)  
    (if (null? items)
	init
	(proc (car items)
	      (reduce proc init (cdr items))))))

reduce

(reduce cons '() '(1 2 3 4))

(define fold-left
  (lambda (proc init items)
    (if (null? items)
	init
	(fold-left proc (cons (car items) init) (cdr items)))))

(fold-left cons '() '(1 2 3 4)) ;; -> 4 3 2 1
