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’.

Reply via email to