Folding (also known as reduce or accumulate) is a method of reducing a sequence of terms down to a single term. This is accomplished by providing a fold function with a binary operator, an initial (or identity) value, and a sequence.
There are two kinds of fold: a right one and a left one.
Here's the definition for the fold-right function:
(define (fold-right f init seq) (if (null? seq) init (f (car seq) (fold-right f init (cdr seq)))))
And here is the definition of fold-left function:
;; recursive function (optimized due to proper tail recursion) (define (fold-left f init seq) (if (null? seq) init (fold-left f (f (car seq) init) (cdr seq))))
(fold-right + 0 '(1 2 3 4)) ; expands to (+ 1 (+ 2 (+ 3 (+ 4 0)))) (fold-left + 0 '(1 2 3 4)) ; expands to (+ 4 (+ 3 (+ 2 (+ 1 0))))
A list reversal function can easily be defined using fold-left:
(define (reverse l) (fold-left (lambda (i j) (cons j i)) '() l))