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

