Just to be clear. The below does work in TR and idx is of type Index. However when one embeds the (in-range 3 5) directly in the for/vector idx is not of type Index. No reason why it shouldn't however.
(: v (Vectorof Symbol)) (define v '#(a b c d e)) (define: s : (Sequenceof Index) (in-range 3 5)) ;; Efficient!!! ;; s : (Sequenceof Index) ;; See below for 's' construction. (for/vector: : (Vectorof Symbol) ([idx : Index s]) (vector-ref v idx)) On Wed, Feb 27, 2013 at 4:34 PM, Ray Racine <[email protected]> wrote: > The below is just an observation. > > Historically in TR I've always struggled with Index vs Fixnum vs Natural > for the vector indexing type when iterating over a vector (or large > sub-ranges or even larger vectors). Either the Optimizer complains that an > index? check was not elided in a vector-ref OR you end up doing something > along the lines of (assert (add1 idx) index?) while looping your index > variable passing over the Vector. > > But I've just noticed that one can construct TR recognized (Sequenceof > Index). > > So in theory, TR + Compiler should be able to elide a number of checks, > such as (assert idx index?), use `unsafe-vector-ref', even elide in loop > bounds checks if the vector is supplied to the 'for'. This assumes the > (Sequenceof Index) is an efficient generator. i.e., (in-range 3 10000000) > is not allocating 10000000 somethings. ( I don't know what it "really" is > happening overall, just what I think is possible. Sufficiently smart > compiler yada yada.) > > ;;;;;;;;;;;;;;;; > ;; Example > ;;;;;;;;;;;;;;;; > > (: v (Vectorof Symbol)) > (define v '#(a b c d e)) > > ;; Efficient!!! > ;; s : (Sequenceof Index) > ;; See below for 's' construction. > (for/vector: : (Vectorof Symbol) > ([idx : Index s]) > (vector-ref v idx)) > > However if one tries to inline the (in-range ...) construction, TR appears > to over-generalized and infers (Sequenceof Positive-Fixnum) in lieu of the > more compiler optimizable specific (Sequenceof Index). > > ;; Not optimal as idx is not recognized as restricted to type Index. > for/vector: : (Vectorof Symbol) > ([idx : Index (in-range 3 5)]) > (vector-ref v idx)) > > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > ;; Creating a (Sequenceof Index) > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > > #lang typed/racket > (require racket/sequence) > > ;; Index bounds checking is occurring on construction!! > ;; (define: s : (Sequenceof Index) (in-range 3 890235782389053905)) > ;; stdin::311: Type Checker: Expected (Sequenceof Index), but got > (Sequenceof Nonnegative-Integer) > ;; in: (in-range 3 890235782389053905) > ;; ... > > (define: s : (Sequenceof Index) (in-range 3 100000000)) > (define-values (s-more? s-next?)(sequence-generate s)) > > ;; > more? > ;; - : (-> Boolean) > ;; #<procedure:sequence-more?> > ;; > next? > ;; - : (-> Index) > ;; #<procedure:sequence-next> > > (: v (Vectorof Symbol)) > (define v '#(a b c d e)) > > (when (s-more?) > (vector-ref v (s-next?))) ;; should be eliding index? check. > >
____________________ Racket Users list: http://lists.racket-lang.org/users

