[racket-dev] [plt] Push #20898: master branch updated

From: Noel Welsh (noelwelsh at gmail.com)
Date: Mon Aug 23 05:25:56 EDT 2010

On Mon, Aug 23, 2010 at 12:26 AM, Will M. Farr <wmfarr at gmail.com> wrote:
> Thanks for sharing your code, and for the comments.  Let me see if I understand this correctly: the following code should produce a total, a vector whose elements are the partial sums of elements at lower indices than the corresponding element of the input vector, and a vector whose elements are partial sums of elements at the index and lower indices of the input vector, right?

Yes, that's correct.

> 1. In my forms, the length is optional, and distinguished (when provided) from the for-clauses by a keyword argument.  In yours, it must be provided as the first for-clause (thus requiring that the index be named).

Yes. Note that my for/vector form will iterate over the indices even
if no other sequence is provided. Thus you can write stuff like this
(taken from some code of mine):

  (for/vector ([i n]) (create-row (+ i l)))

You can ignore the name if you want:

  (for/vector ([_ n-pts]) ...)

> 2. In my forms, the final body expression must produce exactly one value, which becomes the vector element.  In yours, the final body expression must produce exactly as many values as the third argument to the length clause (if provided) or 1 (if no third argument is present).


> As for difference 1, I think it's nice to be able to avoid providing a length if I don't want to.  Sometimes I may not really care about the efficiency of the loop, but will later need a vector, in which case it's a lot less effort to use (for/vector ((i (in-range 3))) ...) than to have to provide a length.  I also prefer the "distinguished" #:length keyword instead of shoehorning the length argument into a not-really-for-clause.  I'm curious what others think, however.

I like having the index bound to a name if I want it. Otherwise I'm
fine with specifying it in an alternate way.

> Difference #2 seems more significant to me.  I really like the idea of being able to produce multiple vectors simultaneously---as you say, it can have efficiency benefits and also be really convenient.  However, note that the for/list form does not allow multiple values from the last body expression, so there is an argument from consistency to prohibit it in for/vector as well.

We don't have to repeat the mistakes of the past :)

> I'd be open to adding another keyword argument, however, to designate some number of vectors (independently of the presence or absence of the #:length keyword) for the output.  I'll put that in the next version, and we can see what other people think.  As with the #:length argument, I would prefer this to be a separate keyword---maybe #:num-vecs, maybe something else---rather than trying to fit it into a special for-clause.

Alternatively, it could be a for/vectors / for/fold/vectors form. I'm neutral.


Posted on the dev mailing list.