<div dir="ltr"><div>Replying to the entire list is hard to remember...</div><div><br></div><div>This doesn't have the full fanciness of the for--- series, but perhaps this is a useful starting point along your suggested API?</div>
<div><br></div><div>(define (make-collector init-val mappend)<br>   (let ([v init-val])<br>    (ë args<br>      (case (length args)<br>        [(0) v]<br>        [(1) (set! v (mappend (car args) v))]<br>        [else (error "for/collect: blah blah blah")]))))</div>
<div><br></div><div>(define-syntax collector<br>  (syntax-rules (list sum)<br>    [(_ sum) (make-collector 0 +)]<br>    [(_ list) (make-collector '() cons)]<br>    ;etc.<br>    ))</div><div><br></div><div>(define-syntax-rule (for/collect ([acc type] ...) ([i lst] ...) body ...)<br>
   (let ([acc (collector type)] ...)<br>    (let loop ([i lst] ...)<br>      (cond [(or (null? i) ...) (values (acc) ...)]<br>            [else (let ([i (car i)] ...)<br>                    body ...)<br>                  (loop (cdr i) ...)]))))</div>
<div><br></div><div>It does use set!, as you feared, but since it's entirely local to the collector implementation I don't think it counts as breaking purity.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Wed, Jan 22, 2014 at 6:49 PM, Sean Kanaley <span dir="ltr"><<a href="mailto:skanaley@gmail.com" target="_blank">skanaley@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>This doesn't have the full fanciness of the for--- series, but perhaps this is a useful starting point along your suggested API?</div><div><br></div><div>(define (make-collector init-val mappend)<br>

  (let ([v init-val])<br>    (ë args<br>      (case (length args)<br>        [(0) v]<br>        [(1) (set! v (mappend (car args) v))]<br>        [else (error "for/collect: blah blah blah")]))))</div><div><br></div>

<div>(define-syntax collector<br>  (syntax-rules (list sum)<br>    [(_ sum) (make-collector 0 +)]<br>    [(_ list) (make-collector '() cons)]<br>    ;etc.<br>    ))</div><div><br></div><div>(define-syntax-rule (for/collect ([acc type] ...) ([i lst] ...) body ...)<br>

  (let ([acc (collector type)] ...)<br>    (let loop ([i lst] ...)<br>      (cond [(or (null? i) ...) (values (acc) ...)]<br>            [else (let ([i (car i)] ...)<br>                    body ...)<br>                  (loop (cdr i) ...)]))))</div>

<div><br></div><div>It does use set!, as you feared, but since it's entirely local to the collector implementation I don't think it counts as breaking purity.<br></div></div>
</blockquote></div><br></div>