diff --git a/collects/mzlib/contract.rkt b/collects/mzlib/contract.rkt index 187db73..1ced3d7 100644 --- a/collects/mzlib/contract.rkt +++ b/collects/mzlib/contract.rkt @@ -23,6 +23,13 @@ (require "private/contract-define.rkt") (provide (all-from-out "private/contract-define.rkt")) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; old-style flat mutable contracts +;; +(require "private/contract-mutable.rkt") +(provide (all-from-out "private/contract-mutable.rkt")) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; provide everything from the racket/ implementation @@ -30,8 +37,6 @@ ;; (require racket/contract/private/base - racket/contract/private/box - racket/contract/private/hash racket/contract/private/misc racket/contract/private/provide racket/contract/private/guts @@ -46,8 +51,6 @@ contract-struct) (all-from-out racket/contract/private/base) - (all-from-out racket/contract/private/box) - (all-from-out racket/contract/private/hash) (all-from-out racket/contract/private/provide) (except-out (all-from-out racket/contract/private/misc) check-between/c diff --git a/collects/mzlib/private/contract-mutable.rkt b/collects/mzlib/private/contract-mutable.rkt new file mode 100644 index 0000000..69f4617 --- /dev/null +++ b/collects/mzlib/private/contract-mutable.rkt @@ -0,0 +1,24 @@ +#lang racket/base + +(require (only-in racket/contract/private/box box-immutable/c) + racket/contract/private/blame + racket/contract/private/guts) + +(provide box/c box-immutable/c) + +(define/subexpression-pos-prop (box/c ctc) + (let ([ctc (coerce-flat-contract 'box/c ctc)]) + (make-flat-contract + #:name (build-compound-type-name 'box/c ctc) + #:first-order + (λ (val) + (and (box? val) + (contract-first-order-passes? ctc (unbox val)))) + #:projection + (λ (blame) + (λ (val) + (let ([proj ((contract-projection ctc) blame)]) + (unless (box? val) + (raise-blame-error blame val "not a box")) + (proj (unbox val)) + val))))))