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))
```

Further reading: