(require mzlib/contract) |
This library is designed as a backwards compatible library for old uses of contracts. It should not be used for new libraries; use racket/contract instead.
The main differences: the function contract syntax is more regular and function contracts now support keywords, and union is now or/c.
The mzlib/contract library re-exports many bindings from racket/contract:
|
| ||
|
| guilty-party | |
|
| ||
|
| ||
|
| ||
|
| ||
|
| make-proj-contract | |
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
| contract-violation->string |
| |
|
| raise-contract-error | |
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
|
|
It also provides the old version of the following forms:
(define/contract id contract-expr init-value-expr) |
The define/contract form treats individual definitions as units of blame. The definition itself is responsible for positive (co-variant) positions of the contract and each reference to id (including those in the initial value expression) must meet the negative positions of the contract.
Error messages with define/contract are not as clear as those provided by provide/contract, because define/contract cannot detect the name of the definition where the reference to the defined variable occurs. Instead, it uses the source location of the reference to the variable as the name of that definition.
(box/c c) → flat-contract? |
c : flat-contract? |
(vectorof c) → flat-contract? |
c : flat-contract? |
(vector/c c ...) → flat-contract? |
c : flat-contract? |
(struct/c struct-id flat-contract-expr ...) |
(->* (contract-dom-expr ...) ->*rng) | ||||||||||
(->* (contract-dom-expr ...) contract-rest-expr ->*rng) | ||||||||||
|
(->* (contract-dom-expr ...) (contract-rng-expr ...)) = (-> contract-dom-expr ... (values contract-rng-expr))
(->* (contract-expr ...) contract-rest-expr any) = (->* (contract-expr ...) #:rest contract-rest-expr any)
(->* (contract-expr ...) contract-rest-expr (contract-rng-expr ...)) = (->* (contract-expr ...) #:rest contract-rest-expr (values contract-rng-expr ...))
(opt-> (contract-req-expr ...) (contact-opt-expr ...) any) |
(opt-> (contract-req-expr ...) (contact-opt-expr ...) contract-rng-expr) |
The opt-> form is a simplified verison of racket/contract’s ->* and appearances of opt-> can be simply replaced with ->*.
(opt->* (contract-req-expr ...) (contact-opt-expr ...) any) |
(opt->* (contract-req-expr ...) (contact-opt-expr ...) (contract-rng-expr ...)) |
The opt->* form matches up to racket/contract’s ->*, according to the following rules; each equation on the the left refers to a mzlib/contract combinator; on the right are the racket/contract equivalents.
(opt->* (contract-req-expr ...) (contract-opt-expr ...) any) = (->* (contract-req-expr ...) (contract-opt-expr ...) any)
(opt->* (contract-req-expr ...) (contract-opt-expr ...) (contract-rng-expr ...)) = (->* (contract-req-expr ...) (contract-opt-expr ...) (values contract-rng-expr ...))
(->d contract-dom-expr ... contract-rng-fun-expr) |
(->d* (contract-dom-expr ...) contract-rng-fun-expr) |
(->d* (contract-dom-expr ...) contract-rest-expr contract-rng-fun-expr) |
In the two sub-expression case, the first sequence of contracts are contracts on the domain of the function and the second subexpression is expected to evaluate to a function that accepts as many arguments as there are expressions in the first position. It should return multiple values: one contract for each result of the function.
In the three sub-expression case, the first and last subexpressions are just like the sub-expressions in the two sub-expression case; the middle sub-expression si expected to evaluate to a contract on the rest argument.
(->r ([dom-x contract-dom-expr] ...) rng) | |||||||||||||||
(->r ([dom-x contract-dom-expr] ...) rest-x contract-rest-expr rng) | |||||||||||||||
|
(->pp ([dom-x contract-dom-expr] ...) pre-cond-expr any) | |||||
| |||||
|