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

Reply via email to