[racket] Cyclic data structures in Typed Racket
Hi everyone,
I am trying to port code creating a cyclic data structure to Typed
Racket, but notice that this is not as straightforward as I expected.
Here is the untyped code I start from:
   #lang racket
   (struct foo (x) #:mutable)
   (struct bar (x))
   (define-values (f b)
     (shared ([f (foo b)]
              [b (bar f)])
             (values f b)))
   (eq? (bar-x b) f)
   (eq? (foo-x f) b)
Switching to Typed Racket and annotating the struct definitions, I get
an error message saying that make-placeholder and placeholder-set!
from racket/base are lacking type annotations. I also get the recommendation
to use require/typed for importing them. OK, let's try:
   #lang typed/racket
   (require/typed racket/base
     [#:opaque Placeholder placeholder?]
     [make-placeholder (-> Any Placeholder)]
     [placeholder-set! (-> Placeholder Any Void)])
   (struct foo ([x : bar]) #:mutable)
   (struct bar ([x : foo]))
   (define-values (f b)
     (shared ([f (foo b)]
              [b (bar f)])
             (values f b)))
   (eq? (bar-x b) f)
   (eq? (foo-x f) b)
Same error message... which is not really surprising. I suppose typed/racket
already requires racket/base, so my additional require/typed has no effect.
But how can I fix this? I don't see any way to exclude items from typed/racket.
Konrad.