
This enables contract generation in the negative direction (untyped->typed) for row polymorphic types (basically mixin types). Depends on `class-seal` and `class-unseal` in the racket/class library.
25 lines
559 B
Racket
25 lines
559 B
Racket
#;
|
|
(exn-pred #rx"an unrelated class")
|
|
#lang racket/base
|
|
|
|
(module u racket
|
|
;; drops cls on the floor, doesn't match spec
|
|
(define (mixin cls)
|
|
(class object% (super-new)))
|
|
|
|
(provide mixin))
|
|
|
|
(module t typed/racket
|
|
;; expects a mixin that adds n
|
|
(require/typed (submod ".." u)
|
|
[mixin
|
|
(All (r #:row)
|
|
(-> (Class #:row-var r)
|
|
(Class #:row-var r [n (-> Integer Integer)])))])
|
|
|
|
(mixin (class object%
|
|
(super-new)
|
|
(define/public (m x) x))))
|
|
|
|
(require 't)
|