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'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 If you find any bugs, just shoot me an email and I'll make sure to fix the problems. -Ian ----- 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