Hi, Ian! > The for[/*] macros are fairly low in the language tower for Racket, so making these kinds of changes robust in the original implementation is cumbersome and error-prone.
I supposed that adding anything as optional would not affect existing stuff. > I've written a shim to use on top of for/fold > and for*/fold to alleviate some pain in multiple value accumulation, post-processing and irrelevant intermediate accumulators. It uses syntax/parse, which is higher in the language tower. Check it out at > > https://github.com/ianj/nifty-macros/tree/master/for-accumulate It's good enough to publish it as a package. > If you find any bugs, just shoot me an email and I'll make sure to fix the problems. > -Ian IMO, `for/acc' or `for/accum' is better than full name. Thanks for answer! > ----- Original Message ----- > From: "oev" <oev-rac...@sibmail.com> > To: dev@racket-lang.org > Sent: Wednesday, May 29, 2013 7:30:59 AM GMT -05:00 US/Canada Eastern Subject: [racket-dev] for/fold feature request > > Hi, all! > > Using `for/fold' with more than one accumulator is inconvenient, when there is a need for auxiliary operations with accumulators before return. > > For example: > > (define (partition pred lst) > (define-values (a1 a2) > (for/fold ([acc1 null] > [acc2 null]) > ([v (in-list lst)]) > (if (pred v) > (values (cons v acc1) acc2) > (values acc1 (cons v acc2))))) > (values (reverse a1) > (reverse a2))) > > In example, it's impossible to reverse accumulators without using intermediate definitions and applying `values' again. > > IMHO, very often in `loop with accumulator' cases, there is a final operation with accumulator before return. > > Is it possible to add ability for defining such final operation as optional or keyword argument? > > For example: > > (define (partition pred lst) > (for/fold ([acc1 null reverse] > [acc2 null reverse]) > ([v (in-list lst)]) > (if (pred v) > (values (cons v acc1) acc2) > (values acc1 (cons v acc2)))))) > > ... or even better: > > (define (partition pred lst) > (for/fold ([acc1 null #:do-finally reverse] > [acc2 null #:do-finally reverse]) > ([v (in-list lst)]) > (if (pred v) > (values (cons v acc1) acc2) > (values acc1 (cons v acc2)))))) > > > > > _________________________ > Racket Developers list: > http://lists.racket-lang.org/dev > _________________________ Racket Developers list: http://lists.racket-lang.org/dev