Next: lists fold reduce, Previous: lists fold derived, Up: lists fold [Index]
Analogous to fold
, but kons is applied to successive
sublists of the lists, rather than successive elements; that is,
kons is applied to the pairs making up the lists, giving this
(tail) recursion:
(pair-fold kons knil ell) ≡ (let ((tail (cdr ell))) (pair-fold kons (kons ell knil) tail)) (pair-fold kons knil '()) ≡ knil
For finite lists, the kons function may reliably apply
set-cdr!
to the pairs it is given without altering the sequence
of execution.
Examples:
(pair-fold (lambda (elm knil) (cons (car elm) knil)) '(999) '(1 2 3)) ⇒ (3 2 1 999) ;;; destructively reverse a list (pair-fold (lambda (pair tail) (set-cdr! pair tail) pair) '() '(0 1 2 3 4 5)) ⇒ (5 4 3 2 1 0)
At least one of the list arguments must be finite.
Hold the same relationship with fold*
that pair-fold
holds
with fold
; obey the recursion:
(pair-fold* kons knil lis) ≡ (kons lis (pair-fold* kons knil (cdr lis))) (pair-fold* kons knil '()) ≡ knil
example:
(pair-fold* cons '() '(a b c)) ⇒ ((a b c) (b c) (c))
At least one of the list arguments must be finite.
Examples:
(pair-fold* (lambda (elm knil) (cons (car elm) knil)) '(999) '(1 2 3)) ⇒ (1 2 3 999) (pair-fold* (lambda (pair tail) (set-cdr! pair tail) pair) '() '(0 1 2 3 4 5)) ⇒ (0 1 2 3 4 5) (pair-fold* (lambda (a b c knil) (cons (list (car a) (car b) (car c)) knil)) '(999) '(1 2 3) '(10 20 30) '(100 200 300)) ⇒ '((1 10 100) (2 20 200) (3 30 300) 999)
Next: lists fold reduce, Previous: lists fold derived, Up: lists fold [Index]