This is similar problem to Map over n consecutive elements inside a list
But this time I want to fold a list of elements into a single value, using more than one element at the time.
e.g.:
for list (1 2 3 4 5)
and N = 2
it will call:
(fn 4 5 (fn 3 4 (fn 2 3 (fn 1 2 <init>))))
The code use function:
* take
from recipe: Select first n elements from list
(define (sublist-reduce n fn init lst)
(let loop ((lst lst) (result init))
(if (< (length lst) n)
result
(let* ((next-list (take lst n))
(args (append! next-list (list result))))
(loop (cdr lst) (apply fn args))))))
The other name for this procedure could be sublist-fold-right
anlalogous to fold-right method from
SRFI-1
Credit: Jakub T. Jankiewicz
(sublist-reduce 2 (lambda (a b) (< a b)) #t '(1 2 3 4))
;; ==> #t
(sublist-reduce 3 (lambda (a b c result)
(and result (= a b c)))
#t
'(2 2 2 3 3 3 4 4 4))
;; ==> #f