Next: lists fold rnrs, Up: lists fold [Index]
In the single list argument case, for a list of 4 elements, the return value of a left–folding with R6RS style, is computed as with:
(fold-left kons knil ell) ≡
(kons (kons (kons (kons knil
(list-ref ell 0))
(list-ref ell 1))
(list-ref ell 2))
(list-ref ell 3))
while with the “traditional” style:
(fold kons knil ell) ≡
(kons (list-ref ell 3)
(kons (list-ref ell 2)
(kons (list-ref ell 1)
(kons (list-ref ell 0)
knil))))
the return value of a right–folding with both R6RS style and “traditional” style, is computed as with:
(fold-right kons knil ell) ≡
(fold* kons knil ell) ≡
(kons (list-ref ell 0)
(kons (list-ref ell 1)
(kons (list-ref ell 2)
(kons (list-ref ell 3)
knil))))
In the multiple list arguments case, for three lists of 4 elements, the return value of a left–folding with R6RS style, is computed as with:
(fold-left kons knil ell0 ell1 ell2) ≡
(kons (kons (kons (kons knil
(list-ref ell0 0)
(list-ref ell1 0)
(list-ref ell2 0))
(list-ref ell0 1)
(list-ref ell1 1)
(list-ref ell2 1))
(list-ref ell0 2)
(list-ref ell1 2)
(list-ref ell2 2))
(list-ref ell0 3)
(list-ref ell1 3)
(list-ref ell2 3))
while with the “traditional” style:
(fold kons knil ell0 ell1 ell2) ≡
(kons (list-ref ell0 3)
(list-ref ell1 3)
(list-ref ell2 3)
(kons (list-ref ell0 2)
(list-ref ell1 2)
(list-ref ell2 2)
(kons (list-ref ell0 1)
(list-ref ell1 1)
(list-ref ell2 1)
(kons (list-ref ell0 0)
(list-ref ell1 0)
(list-ref ell2 0)
knil))))
the return value of a right–folding with both R6RS style and “traditional” style, is computed as with:
(fold-right kons knil ell0 ell1 ell2) ≡
(fold* kons knil ell0 ell1 ell2) ≡
(kons (list-ref ell0 0)
(list-ref ell1 0)
(list-ref ell2 0)
(kons (list-ref ell0 1)
(list-ref ell1 1)
(list-ref ell2 1)
(kons (list-ref ell0 2)
(list-ref ell1 2)
(list-ref ell2 2)
(kons (list-ref ell0 3)
(list-ref ell1 3)
(list-ref ell2 3)
knil))))
Left–folding, usage examples for fold in the single list
argument case:
;; add the elements
(fold + 0 '(1 2 3)) ⇒ 6
;; reverse a list
(fold cons '() '(1 2 3)) ⇒ (3 2 1)
;; append in reverse order
(fold cons '(4 5 6) '(3 2 1)) ⇒ (1 2 3 4 5 6)
;; how many symbols?
(fold (lambda (x count)
(if (symbol? x)
(+ count 1)
count))
0
'(a 1 b 2 c 3)) ⇒ 3
Right–folding usage examples for fold* in the single list
argument case:
;; copy the list
(fold* cons '() '(1 2 3)) ⇒ (1 2 3)
;; add elements
(fold* + 0 numbers) ⇒ 45
;; prepend elements
(fold* cons '(4 5 6) '(1 2 3)) ⇒ (1 2 3 4 5 6)
;; filter the even numbers
(fold* (lambda (x l)
(if (even? x)
(cons x l)
l))
'()
'(0 1 2 3 4 5 6 7 8 9))
⇒ (0 2 4 6 8)
Usage examples for fold and fold* in the multiple list
argument case:
(fold (lambda (a b c knil)
(cons (list a b c) knil))
'()
'(1 2 3)
'(10 20 30)
'(100 200 300))
⇒ '((3 30 300)
(2 20 200)
(1 10 100))
(fold* (lambda (a b c knil)
(cons (list a b c)
knil))
'()
'(1 2 3)
'(10 20 30)
'(100 200 300))
⇒ ((1 10 100)
(2 20 200)
(3 30 300))
Next: lists fold rnrs, Up: lists fold [Index]