Andy Wingo <wi...@pobox.com> skribis: > On Wed 22 May 2013 22:44, l...@gnu.org (Ludovic Courtès) writes: > >>> -(define (fold2 proc ls s0 s1) >>> - (let lp ((ls ls) (s0 s0) (s1 s1)) >>> - (if (null? ls) >>> - (values s0 s1) >>> - (receive (s0 s1) (proc (car ls) s0 s1) >>> - (lp (cdr ls) s0 s1))))) >>> - >>> (define (fold4 proc ls s0 s1 s2 s3) >>> (let lp ((ls ls) (s0 s0) (s1 s1) (s2 s2) (s3 s3)) >>> (if (null? ls) >>> @@ -236,15 +231,9 @@ >>> (receive (s0 s1 s2 s3) (proc (car ls) s0 s1 s2 s3) >>> (lp (cdr ls) s0 s1 s2 s3))))) >>> >>> -(define (fold5 proc ls s0 s1 s2 s3 s4) >>> - (let lp ((ls ls) (s0 s0) (s1 s1) (s2 s2) (s3 s3) (s4 s4)) >>> - (if (null? ls) >>> - (values s0 s1 s2 s3 s4) >>> - (receive (s0 s1 s2 s3 s4) (proc (car ls) s0 s1 s2 s3 s4) >>> - (lp (cdr ls) s0 s1 s2 s3 s4))))) >> >> What about moving these to a helper module eventually? > > Sure. Or maybe a fold-values that takes a variable number of arguments and > inlines itself... > > (define-syntax fold-values > (lambda (x) > (syntax-case x () > ((_ proc list seed ...) > (with-syntax (((s ...) (generate-temporaries #'(seed ...)))) > #'(let ((p proc)) > (let lp ((l list) (s seed) ...) > (match l > (() (values s ...)) > ((elt . l) > (call-with-values (lambda () (p elt s ...)) > (lambda (s ...) > (lp l s ...))))))))))))
Even better. :-) Ludo’.