[racket] Typed Racket - (Sequenceof Index) As Looping Index

From: Ray Racine (ray.racine at gmail.com)
Date: Wed Feb 27 16:51:42 EST 2013

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 <ray.racine at gmail.com> 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.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130227/9d1fb107/attachment.html>

Posted on the users mailing list.