[racket] typed racket: inconsistent interaction between typed and untyped code?
Danny,
This is an issue with the type Any. Typed Racket has to protect all
values passed from typed code to untyped code from all possible
type-unsound uses. For many kinds of values, this means Typed Racket
has to close off pretty much all kinds of uses. In your case, you
have a transparent struct. If it were unwrapped, untyped code could
inspect it, extract a constructor for its struct type, create an
instance with field contents that violate your define-struct:
declaration, and pass it back into typed code. You have to be very
careful with Any on boundaries, because it has to make a lot of things
completely opaque.
Sadly, off the top of my head, I don't have a quick workaround for
you. Maybe Sam will have a better suggestion.
Carl Eastlund
On Fri, Mar 4, 2011 at 4:20 PM, Danny Yoo <dyoo at cs.wpi.edu> wrote:
> I'm hitting an error when trying to pass values between typed and
> untyped code. I've shrunk the error to the following test code.
> Consider three files 'sim-structs', 'sim.rkt', and 'test-sim.rkt'.
> sim-structs and sim are written in Typed Racket, and test-sim is
> written in regular racket.
>
> ;; sim-structs.rkt
> #lang typed/racket/base
> (provide (all-defined-out))
> (define-struct: machine ([env : (Listof Any)])) #:transparent)
> (define-struct: toplevel ([vals : (Vectorof Any)]) #:transparent)
>
>
> ;; sim.rkt
> #lang typed/racket/base
> (require "sim-structs.rkt")
> (provide new-machine)
> (: new-machine ( -> machine))
> (define (new-machine)
> (make-machine (list (make-toplevel (vector 'foobar)))))
>
>
> ;; test-sim.rkt
> #lang racket
> (require "sim.rkt" "sim-structs.rkt")
> (toplevel-vals (first (machine-env (new-machine))))
>
>
>
> When I try to execute test-sim, it fails with the following error:
>
>
> tesla ~/work/js-sicp-5-5 $ /pro/plt/software/racket/5.1/std/bin/racket
> test-sim.rkt
> contract violation: expected <toplevel?>, given: #<Typed Value:
> #(struct:toplevel #(foobar))>
> contract on toplevel-vals24 from
> (file
> /home/dyoo/work/js-sicp-5-5/sim-structs.rkt)
> via
> (file
> /home/dyoo/work/js-sicp-5-5/test-sim.rkt)
> blaming
> (file /home/dyoo/work/js-sicp-5-5/sim.rkt)
> contract: (-> toplevel? (vectorof Any))
> at: /home/dyoo/work/js-sicp-5-5/sim-structs.rkt:11.16
>
> === context ===
> /pro/plt/software/racket/5.1/std/collects/racket/contract/private/blame.rkt:58:0:
> raise-blame-error
> /home/dyoo/work/js-sicp-5-5/test-sim.rkt: [running body]
>
>
>
> It looks as though there's some special "Typed Value" wrapper there
> that shouldn't be visible from the untyped test-sim code. Is there a
> workaround?
> _________________________________________________
> For list-related administrative tasks:
> http://lists.racket-lang.org/listinfo/users
>
>