Suffice it to say, my package does not have that expressive power. I'd be happy 
to collaborate with you to design a good extension to my package so that this 
kind of accumulation is easier.
-Ian
----- Original Message -----
From: "Roman Klochkov" <[email protected]>
To: "J. Ian Johnson" <[email protected]>
Cc: [email protected]
Sent: Saturday, January 18, 2014 1:13:38 PM GMT -05:00 US/Canada Eastern
Subject: Re[2]: [racket] Style. for/fold for/list for/lists

It is great generalization for for/fold 

But still missed something like this: 

(iter (for i in l) 
(if (oddp i) (collect i into a) (collect i into b)) 
(when (> i 10) 
(collect i into a)) 
(finally (return a b))) 

Or in your for/acc 
(for/acc ([:type append] [:type append]) 
([i (in-list l)]) 
(if (odd? i) (values (if (> i 10) (list i i) (list i)) null) 
(values (if (> i 10) (list i) null) (list i)))) 

I had to double condition and the result is not so transparent. 

Simple solution is: 

(define (make-collector init add post) 
(let ([a init]) 
(case-lambda 
[(val) (set! a (add val a)] 
[() a]))) 

(define (make-list-collector [init '()]) (make-collector init cons reverse)) 

(let ([a (make-list-collector)] 
[b (make-list-collector)]) 
(for ([i (in-list l)]) 
(if (odd? i) (a i) (b i)) 
(when (> i 10) (a i))) 
(values (a) (b))) 

But they say, that purity is the best and one should avoid set!... so this way 
is the dark way, isn't it? 


Суббота, 18 января 2014, 8:02 -05:00 от "J. Ian Johnson" <[email protected]>: 






You have hit limitations of the for/fold macros. I wrote an extension for 
controlling the way values get accumulated, along with post-processing like 
list reversal. Let me know what you think! 

https://github.com/ianj/nifty-macros/tree/master/for-acc 
-Ian 
----- Original Message ----- 
From: Roman Klochkov < [email protected] > 
To: [email protected] 
Sent: Sat, 18 Jan 2014 06:25:10 -0500 (EST) 
Subject: [racket] Style. for/fold for/list for/lists 

Where can I find style guide for these 

for/lists: 

I have to duplicate values names: 

(define-values ([(desc-args lengths add-data) 
(for/lists (desc-args lengths add-data) ([arg (in-list %args)]) 
....)) is it ok? Or better 
(define-values ([(desc-args lengths add-data) 
(for/lists (a b c) (...) ...)) 

? 

for/fold has no "return" clause. So I have to do 
(call-with-values 
(for/fold (acc1 acc2 sum) (...) ...) 
(lambda (acc1 acc2 sum) (reverse acc1) (reverse acc2) sum)) 

And for/list doesn't allow to add several items to resulting list in one round. 
Even with for/fold it gives 

(reverse 
(for/fold (acc) ([item (in-list list)]) 
(values (cons (get-val1 item) 
(cons (get-val2 item) acc))))) 

Awful, especially for reading. 

It is clumsy and unobvious. 
In Common Lisp iterate I could do 
(iter (...) 
(collect (foo) into acc1) 
(collect (bar) into acc2) 
(summing ... into sum) 
(finally (return acc1 acc2 sum))) 

http://common-lisp.net/project/iterate/doc/index.html 

Is there something similar? 

-- 
Roman Klochkov 


-- 
Roman Klochkov 

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to