On Sun, Aug 22, 2010 at 9:36 PM, Will M. Farr <wmf...@gmail.com> wrote: > Matthew & co, ... > I'll make sure to throw a syntax error if I see a #:when in the for-clauses, > and I think I should give up on the for*/vector #:length variant. I was > hoping that you would have some sort of neat trick to keep a running counter > during the nested iteration....
I'm pretty sure this will exclude a lot of my code. I'll have to check tomorrow. My for/vector allows one to construct multiple vectors in one iteration. This is fairly useful to efficient code. I also bind the length to a name. I thought I checked that this counter was exactly the length after the comprehension terminated, but it appears I don't. Code is below. You won't be surprised to hear I prefer my variant ;-). I have uses for every feature that I can dreg up if anyone is interested. I'm keen to see a for/vector comprehension in Racket. N. (define-syntax (for/fold/vector stx) (syntax-case stx () [(for/fold/vector ([accum-id init-expr] ...) ([idx length] for-clause ...) body ...) (syntax (for/fold/vector ([accum-id init-expr] ...) ([idx length 1] for-clause ...) body ...))] [(for/fold/vector ([accum-id init-expr] ...) ([idx length n-vectors]) body ...) (syntax (let ([l length]) (for/fold/vector ([accum-id init-expr] ...) ([idx l n-vectors] [_ (in-range l)]) body ...)))] [(for/fold/vector () ([idx length n-vectors] for-clause0 for-clause ...) body ...) (with-syntax ([(v-id ...) (datum->syntax stx (for/list ([i (in-range (syntax->datum (syntax n-vectors)))]) (gensym 'for-vector)) (syntax n-vectors))] [(temp-id ...) (datum->syntax stx (for/list ([i (in-range (syntax->datum (syntax n-vectors)))]) (gensym 'for-vector)) (syntax n-vectors))]) (syntax (let* ([l length] [idx 0] [v-id (make-vector l)] ...) (begin (for (for-clause0 for-clause ...) (let-values (([temp-id ...] (let () body ...))) (vector-set! v-id idx temp-id) ... (set! idx (add1 idx)))) (values v-id ...)))))] [(for/fold/vector ([accum-id0 init-expr0] [accum-id init-expr] ...) ([idx length n-vectors] for-clause0 for-clause ...) body ...) (with-syntax ([(v-id ...) (datum->syntax stx (for/list ([i (in-range (syntax->datum (syntax n-vectors)))]) (gensym 'for-vector)) (syntax n-vectors))] [(temp-id ...) (datum->syntax stx (for/list ([i (in-range (syntax->datum (syntax n-vectors)))]) (gensym 'for-vector)) (syntax n-vectors))]) (syntax (let* ([l length] [idx 0] [v-id (make-vector l)] ...) (let-values (([accum-id0 accum-id ...] (for/fold ([accum-id0 init-expr0] [accum-id init-expr] ...) (for-clause0 for-clause ...) (let-values (([accum-id0 accum-id ... temp-id ...] (let () body ...))) (vector-set! v-id idx temp-id) ... (set! idx (add1 idx)) (values accum-id0 accum-id ...))))) (values accum-id0 accum-id ... v-id ...)))))])) (define-syntax (for/vector stx) (syntax-case stx () [(for/vector (for-clause ...) body ...) (syntax (for/fold/vector () (for-clause ...) body ...))])) _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev