racket/collects/scheme/contract.ss
2009-09-17 20:55:37 +00:00

199 lines
5.6 KiB
Scheme

#lang scheme/base
#|
differences from v3:
. define/contract is no longer supported
. ->d and ->* are different
. ->r ->pp opt-> and opt->* are gone
|#
(require "contract/private/arrow.ss"
"contract/private/base.ss"
scheme/contract/exists
"contract/private/misc.ss"
"contract/private/provide.ss"
scheme/contract/regions
"contract/private/guts.ss"
"contract/private/ds.ss"
"contract/private/opt.ss"
"contract/private/basic-opters.ss")
(provide
opt/c define-opt/c ;(all-from-out "contract/private/opt.ss")
(except-out (all-from-out "contract/private/ds.ss")
lazy-depth-to-look)
(except-out (all-from-out "contract/private/arrow.ss")
making-a-method
procedure-accepts-and-more?
check-procedure
check-procedure/more)
(except-out (all-from-out scheme/contract/exists) ?)
(except-out (all-from-out "contract/private/misc.ss")
check-between/c
check-unary-between/c)
(all-from-out scheme/contract/regions)
(all-from-out "contract/private/provide.ss")
(all-from-out "contract/private/base.ss"))
;; from contract-guts.ss
(provide any
and/c
any/c
none/c
make-none/c
guilty-party
exn:fail:contract2?
exn:fail:contract2-srclocs
contract-violation->string
contract?
contract-name
contract-proc
flat-contract?
flat-contract
flat-contract-predicate
flat-named-contract
contract-first-order-passes?
;; below need docs
make-proj-contract
contract-stronger?
coerce-contract/f
coerce-contract
coerce-contracts
coerce-flat-contract
coerce-flat-contracts
build-compound-type-name
raise-contract-error
proj-prop proj-pred? proj-get
name-prop name-pred? name-get
stronger-prop stronger-pred? stronger-get
flat-prop flat-pred? flat-get
first-order-prop first-order-get)
;; ======================================================================
;; The alternate implementation disables contracts. Its useful mainly to
;; measure the cost of contracts. It's not necessarily complete, but it
;; works well enough for starting DrScheme.
;; (last used pre v4)
#;
(module contract mzscheme
(define-syntax provide/contract
(syntax-rules ()
[(_ elem ...)
(begin (provide-one elem) ...)]))
(define-syntax provide-one
(syntax-rules (struct rename)
[(_ (struct (id par-id) ([field . rest] ...)))
(provide-struct id par-id (field ...))]
[(_ (struct id ([field . rest] ...)))
(provide (struct id (field ...)))]
[(_ (rename id1 id2 c))
(provide (rename id1 id2))]
[(_ (id c))
(provide id)]))
(define-syntax (provide-struct stx)
(syntax-case stx ()
[(_ id par-id . rest)
(let ([info (syntax-local-value #'id (lambda () #f))]
[p-info (syntax-local-value #'par-id (lambda () #f))]
[prefix (lambda (l n)
(let loop ([l l][len (length l)])
(if (= n len)
null
(cons (car l) (loop (cdr l)
(- len 1))))))]
[ids (lambda (l) (let loop ([l l])
(cond
[(null? l) null]
[(car l) (cons (car l) (loop (cdr l)))]
[else (loop (cdr l))])))])
(if (and info
p-info
(list? info)
(list? p-info)
(= (length info) 6)
(= (length p-info) 6))
#`(provide #,@(append
(list #'id
(list-ref info 0)
(list-ref info 1)
(list-ref info 2))
(ids (prefix (list-ref info 3) (length (list-ref p-info 3))))
(ids (prefix (list-ref info 4) (length (list-ref p-info 4))))))
(raise-syntax-error
#f
(cond
[(not info) "cannot find struct info"]
[(not p-info) "cannot find parent-struct info"]
[else (format "struct or parent-struct info has unexpected shape: ~e and ~e"
info p-info)])
#'id)))]))
(define-syntax define-contract-struct
(syntax-rules ()
[(_ . rest) (define-struct . rest)]))
(define-syntax define/contract
(syntax-rules ()
[(_ id c expr) (define id expr)]))
(define-syntax contract
(syntax-rules ()
[(_ c expr . rest) expr]))
(provide provide/contract
define-contract-struct
contract)
(define mk*
(lambda args (lambda (x) x)))
(define-syntax mk
(syntax-rules ()
[(_ id) (begin
(define-syntax (id stx) (quote-syntax mk*))
(provide id))]
[(_ id ...)
(begin (mk id) ...)]))
(mk ->
->*
opt->
case->
->r
or/c
and/c
any/c
flat-named-contract
flat-contract
flat-contract-predicate
object-contract
listof
is-a?/c)
(define-syntax symbols
(syntax-rules ()
[(_ sym ...)
(lambda (v) (memq v '(sym ...)))]))
(provide symbols)
)