On 07/06/2012 09:11 AM, Sam Tobin-Hochstadt wrote:
On Fri, Jul 6, 2012 at 11:59 AM, Neil Toronto <neil.toro...@gmail.com> wrote:
Anticipating a bug fix, I've started converting my recent TR code so that it
doesn't define predicates for mutable container types. Instead of using
`define-predicate', I need to *copy* the mutable data structure, using
occurrence typing on each immutable containee. It's kind of a pain, but I
only have one type that needs this treatment.

Can you not do the checking *after* extracting the elements from the
container?  That may well be faster.

I can't maintain my invariants that way, because the same user code that sent the container might change the contained values.

(define-converter (make-vectorof T) (Vectorof T))

#;(: make-vectorof (All (A B) ((A -> Boolean : B)
                                (Vectorof A) -> (U False (Vectorof B)))))
;; Receives a predicate that indicates `B' instances and a vector
;; Returns #f when every `A' in the vector isn't also a `B'

[...]

I'm confused about what this does.  When does it copy, and when does
it produce `#false`?

Here's a case where `make-vectorof' copies:

    (define ds (vector 0 1 2 3))
    (make-vectorof index? ds)

Here's a case where `make-vectorof' returns #f:

    ;; (expt 2 60) is not an Index on any platform:
    (define ds (vector (expt 2 60)))
    (make-vectorof index? ds)

Of course, this wouldn't leverage the contract system nicely like
define-predicate does.

And in general, implicitly copying mutable data seems like a bad idea
-- mutable data is for sharing.

I don't read `(make-vectorof index? ds)' as implicit.

It's generally true that mutable data is for sharing. But sometimes I don't intend to share mutable data; for example, when using a mutable data structure is a lot faster than using its functional counterpart. In that case, there's no way to follow basic user-interface guidelines for typing functions; i.e. to have general argument types and precise return types.

It's kind of a moot point now, anyway. I've decided to receive (Listof Integer) and return (Listof Index), and convert them to and from vectors. Lists will subtype nicely for my library users.

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

Reply via email to