[racket-dev] for/fold feature request
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-racket at sibmail.com>
To: dev at 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