<div dir="ltr"><div style>The below is just an observation.  </div><div style><br></div><div style>Historically in TR I&#39;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.</div>
<div style><br></div><div style>But I&#39;ve just noticed that one can construct TR recognized (Sequenceof Index).  </div><div style><br></div><div style>So in theory, TR + Compiler should be able to elide a number of checks, such as (assert idx index?), use `unsafe-vector-ref&#39;, even elide in loop bounds checks if the vector is supplied to the &#39;for&#39;.  This assumes the (Sequenceof Index) is an efficient generator.  i.e., (in-range 3 10000000) is not allocating 10000000 somethings. ( I don&#39;t know what it &quot;really&quot; is happening overall, just what I think is possible.  Sufficiently smart compiler yada yada.)</div>
<div style><br></div><div style>;;;;;;;;;;;;;;;;</div><div style>;; Example</div><div style>;;;;;;;;;;;;;;;;</div><div style><br></div><div style><div>(: v (Vectorof Symbol))</div><div>(define v &#39;#(a b c d e))</div></div>
<div style><br></div><div style>;; Efficient!!!</div><div style>;; s : (Sequenceof Index) </div><div style>;; See below for &#39;s&#39; construction.</div><div style><div>(for/vector: : (Vectorof Symbol) </div><div>  ([idx : Index s])</div>
<div>  (vector-ref v idx))</div><div><br></div><div style>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).</div>
<div><br></div><div style>;; Not optimal as idx is not recognized as restricted to type Index.</div></div><div style><div>for/vector: : (Vectorof Symbol) </div><div>  ([idx : Index (in-range 3 5)])</div><div>  (vector-ref v idx))</div>
</div><div style><br></div><div style>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</div><div style>;; Creating a (Sequenceof Index)</div><div style>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</div><div style><br>
</div><div style><div>#lang typed/racket</div><div>(require racket/sequence)</div><div><br></div><div>;; Index bounds checking is occurring on construction!!</div><div>;; (define: s : (Sequenceof Index) (in-range 3 890235782389053905))</div>
<div>;; stdin::311: Type Checker: Expected (Sequenceof Index), but got (Sequenceof Nonnegative-Integer)</div><div>;;  in: (in-range 3 890235782389053905)</div><div>;; ...</div><div><br></div><div>(define: s : (Sequenceof Index) (in-range 3 100000000))</div>
<div>(define-values (s-more? s-next?)(sequence-generate s))</div><div><br></div><div>;; &gt; more?</div><div>;; - : (-&gt; Boolean)</div><div>;; #&lt;procedure:sequence-more?&gt;</div><div>;; &gt; next?</div><div>;; - : (-&gt; Index)</div>
<div>;; #&lt;procedure:sequence-next&gt;</div><div><br></div><div>(: v (Vectorof Symbol))</div><div>(define v &#39;#(a b c d e))</div><div><br></div><div>(when (s-more?)</div><div>  (vector-ref v (s-next?))) ;; should be eliding index? check.</div>
<div><br></div></div></div>