On 08/15/2012 08:05 AM, Sam Tobin-Hochstadt wrote:
On Wed, Aug 15, 2012 at 9:54 AM, Neil Toronto <neil.toro...@gmail.com> wrote:
When #:length is given, it's similar in that it creates a vector outside the
loop and bangs values into it. But I have to start with (define vs (vector))
and then (set! vs (make-vector n v)) when the first value `v' is computed.
The docs for `for/vector' say any values not computed in the loop are
supposed to be 0, but that doesn't work well in TR: it'd have to create a
(Vectorof (U T 0)). Ick.

So then the first value computed is replicated everywhere?  That seems
unappealing as well.

It costs nothing, and if the #:length argument matches the number of iterations, the user never sees it.

Other options:

 1. Raise an error when the vector isn't filled.
 2. Return a (Vectorof (U T #f)) (better than (Vectorof (U T 0))?).
 3. Always return a vector whose length is the number of iterations.

For #3, the #:length argument would mean one of two things:

 A. An upper bound on the number of iterations.
 B. A "best guess" at the number of iterations.

For B, I could make it just as efficient as my current implementation when the guess is correct. Not giving #:length would be equivalent to giving #:length 1 (or some other small number).

But if implemented in Racket, #3 would break any code that depends on #:length limiting the number of iterations.

Also, is there any way you could generate code that uses a binding,
instead of `set!`?  That will probably improve the performance.

Good idea. I'll try using `for/fold:' instead of `for:'.

I think I could work one up that expands to code with annotations when used
from TR and to code without annotations otherwise. I'd use the
"maybe-annotate" macro (`ann:') for every annotation, not just for
annotating with the optional result and body types.

I don't think that's a good idea -- then `racket/base` would have to
expand to Typed Racket-specific code.  Is there a way that you can
come up with an abstraction that is oblivious to Typed Racket?

I think something that accepts macros that expand to (vector) and (make-vector n v) would work. Only those expressions really need annotations.

Neil ⊥

_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to