[racket] typed racket: inconsistent interaction between typed and untyped code?

From: Carl Eastlund (cce at ccs.neu.edu)
Date: Fri Mar 4 17:22:13 EST 2011


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

Posted on the users mailing list.