remove implementations of non-late-neg projections from bunch of combinators

This commit is contained in:
Robby Findler 2015-12-21 07:36:56 -06:00
parent 7d02f4c7b1
commit 8776ab7686
3 changed files with 5 additions and 353 deletions

View File

@ -128,32 +128,7 @@
[fail-proc (fail-proc neg-party)]
[else
(late-neg-proj (unbox val) neg-party)
val]))))
#:projection
(λ (ctc)
(λ (blame)
(λ (val)
(check-box/c ctc val blame)
(((contract-projection (base-box/c-content-w ctc)) blame) (unbox val))
val)))))
(define (ho-projection box-wrapper)
(λ (ctc)
(let ([elem-w-ctc (base-box/c-content-w ctc)]
[elem-r-ctc (base-box/c-content-r ctc)]
[immutable (base-box/c-immutable ctc)])
(λ (blame)
(let ([pos-elem-r-proj ((contract-projection elem-r-ctc) blame)]
[neg-elem-w-proj ((contract-projection elem-w-ctc) (blame-swap blame))])
(λ (val)
(check-box/c ctc val blame)
(if (and (immutable? val) (not (chaperone? val)))
(box-immutable (pos-elem-r-proj (unbox val)))
(box-wrapper val
(λ (b v) (pos-elem-r-proj v)) ; unbox-proc
(λ (b v) (neg-elem-w-proj v)) ; set-proc
impersonator-prop:contracted ctc
impersonator-prop:blame blame))))))))
val]))))))
(define (ho-late-neg-projection chaperone/impersonate-box)
(λ (ctc)
@ -188,8 +163,7 @@
#:name box/c-name
#:first-order box/c-first-order
#:stronger box/c-stronger
#:late-neg-projection (ho-late-neg-projection chaperone-box)
#:projection (ho-projection chaperone-box)))
#:late-neg-projection (ho-late-neg-projection chaperone-box)))
(define-struct (impersonator-box/c base-box/c) ()
#:property prop:custom-write custom-write-property-proc
@ -198,8 +172,7 @@
#:name box/c-name
#:first-order box/c-first-order
#:stronger box/c-stronger
#:late-neg-projection (ho-late-neg-projection impersonate-box)
#:projection (ho-projection impersonate-box)))
#:late-neg-projection (ho-late-neg-projection impersonate-box)))
(define-syntax (wrap-box/c stx)
(syntax-case stx ()

View File

@ -110,17 +110,6 @@
(let ([tests (map contract-first-order (base-and/c-ctcs ctc))])
(λ (x) (for/and ([test (in-list tests)]) (test x)))))
(define (and-proj ctc)
(let ([mk-pos-projs (map contract-projection (base-and/c-ctcs ctc))])
(lambda (blame)
(define projs
(for/list ([c (in-list mk-pos-projs)]
[n (in-naturals 1)])
(c (blame-add-context blame (format "the ~a conjunct of" (n->th n))))))
(for/fold ([proj (car projs)])
([p (in-list (cdr projs))])
(λ (v) (p (proj v)))))))
(define (late-neg-and-proj ctc)
(define mk-pos-projs (map get/build-late-neg-projection (base-and/c-ctcs ctc)))
(λ (blame)
@ -137,22 +126,6 @@
(loop (cdr projs)
((car projs) val neg-party))])))))
(define (first-order-and-proj ctc)
(λ (blame)
(λ (val)
(let loop ([predicates (first-order-and/c-predicates ctc)]
[ctcs (base-and/c-ctcs ctc)])
(cond
[(null? predicates) val]
[else
(cond
[((car predicates) val)
(loop (cdr predicates) (cdr ctcs))]
[else
(define ctc1-proj (contract-projection (car ctcs)))
(define new-blame (blame-add-context blame "an and/c case of"))
((ctc1-proj new-blame) val)])])))))
(define (first-order-late-neg-and-proj ctc)
(define predicates (first-order-and/c-predicates ctc))
(define blame-accepters (map get/build-late-neg-projection (base-and/c-ctcs ctc)))
@ -270,7 +243,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:flat-contract
(build-flat-contract-property
#:projection first-order-and-proj
#:late-neg-projection first-order-late-neg-and-proj
#:name and-name
#:first-order and-first-order
@ -280,7 +252,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:projection and-proj
#:late-neg-projection late-neg-and-proj
#:name and-name
#:first-order and-first-order
@ -290,7 +261,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:contract
(build-contract-property
#:projection and-proj
#:late-neg-projection late-neg-and-proj
#:name and-name
#:first-order and-first-order
@ -674,47 +644,6 @@
[else
(elem-fo? v)])))]))
(define (listof-projection ctc)
(define elem-proj (contract-projection (listof-ctc-elem-c ctc)))
(define pred? (if (pe-listof-ctc? ctc)
list?
non-empty-list?))
(λ (blame)
(define elem-proj+blame (elem-proj (blame-add-listof-context blame)))
(cond
[(flat-listof-ctc? ctc)
(if (im-listof-ctc? ctc)
(λ (val)
(let loop ([val val])
(cond
[(pair? val)
(elem-proj+blame (car val))
(loop (cdr val))]
[else
(elem-proj+blame val)]))
val)
(λ (val)
(if (pred? val)
(begin
(for ([x (in-list val)])
(elem-proj+blame x))
val)
(raise-listof-blame-error blame val (pe-listof-ctc? ctc) #f))))]
[else
(if (im-listof-ctc? ctc)
(λ (val)
(let loop ([val val])
(cond
[(pair? val)
(cons (elem-proj+blame (car val))
(loop (cdr val)))]
[else (elem-proj+blame val)])))
(λ (val)
(if (pred? val)
(for/list ([x (in-list val)])
(elem-proj+blame x))
(raise-listof-blame-error blame val (pe-listof-ctc? ctc) #f))))])))
(define (listof-late-neg-projection ctc)
(define elem-proj (get/build-late-neg-projection (listof-ctc-elem-c ctc)))
(define pred? (if (pe-listof-ctc? ctc)
@ -762,7 +691,6 @@
(build-flat-contract-property
#:name list-name
#:first-order list-fo-check
#:projection listof-projection
#:late-neg-projection listof-late-neg-projection
#:generate listof-generate
#:exercise listof-exercise
@ -772,7 +700,6 @@
(build-chaperone-contract-property
#:name list-name
#:first-order list-fo-check
#:projection listof-projection
#:late-neg-projection listof-late-neg-projection
#:generate listof-generate
#:exercise listof-exercise
@ -782,7 +709,6 @@
(build-contract-property
#:name list-name
#:first-order list-fo-check
#:projection listof-projection
#:late-neg-projection listof-late-neg-projection
#:generate listof-generate
#:exercise listof-exercise
@ -877,7 +803,6 @@
(define (blame-add-car-context blame) (blame-add-context blame "the car of"))
(define (blame-add-cdr-context blame) (blame-add-context blame "the cdr of"))
(define ((cons/c-late-neg-ho-check combine) ctc)
(define ctc-car (the-cons/c-hd-ctc ctc))
(define ctc-cdr (the-cons/c-tl-ctc ctc))
@ -893,19 +818,6 @@
(car-p (car v) neg-party)
(cdr-p (cdr v) neg-party)))))
(define ((cons/c-ho-check combine) ctc)
(define ctc-car (the-cons/c-hd-ctc ctc))
(define ctc-cdr (the-cons/c-tl-ctc ctc))
(define car-proj (contract-projection ctc-car))
(define cdr-proj (contract-projection ctc-cdr))
(λ (blame)
(let ([car-p (car-proj (blame-add-car-context blame))]
[cdr-p (cdr-proj (blame-add-cdr-context blame))])
(λ (v)
(unless (pair? v)
(raise-not-cons-blame-error blame v))
(combine v (car-p (car v)) (cdr-p (cdr v)))))))
(define (cons/c-first-order ctc)
(define ctc-car (the-cons/c-hd-ctc ctc))
(define ctc-cdr (the-cons/c-tl-ctc ctc))
@ -962,7 +874,6 @@
#:property prop:flat-contract
(build-flat-contract-property
#:late-neg-projection (cons/c-late-neg-ho-check (λ (v a d) v))
#:projection (cons/c-ho-check (λ (v a d) v))
#:name cons/c-name
#:first-order cons/c-first-order
#:stronger cons/c-stronger?
@ -973,7 +884,6 @@
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:late-neg-projection (cons/c-late-neg-ho-check (λ (v a d) (cons a d)))
#:projection (cons/c-ho-check (λ (v a d) (cons a d)))
#:name cons/c-name
#:first-order cons/c-first-order
#:stronger cons/c-stronger?
@ -984,7 +894,6 @@
#:property prop:contract
(build-contract-property
#:late-neg-projection (cons/c-late-neg-ho-check (λ (v a d) (cons a d)))
#:projection (cons/c-ho-check (λ (v a d) (cons a d)))
#:name cons/c-name
#:first-order cons/c-first-order
#:stronger cons/c-stronger?
@ -1267,38 +1176,8 @@
val
'(expected "a list" given: "~e")
val)]))))
#:projection
(lambda (c)
(lambda (blame)
(lambda (x)
(unless (list? x)
(raise-blame-error blame x '(expected "a list" given: "~e") x))
(let* ([args (generic-list/c-args c)]
[expected (length args)]
[actual (length x)])
(expected-a-list-of-len x actual expected blame)
(for ([arg/c (in-list args)] [v (in-list x)] [i (in-naturals 1)])
(((contract-projection arg/c)
(add-list-context blame i))
v))
x))))
#:list-contract? (λ (c) #t)))
(define (list/c-chaperone/other-projection c)
(define args (map contract-projection (generic-list/c-args c)))
(define expected (length args))
(λ (blame)
(define projs (for/list ([arg/c (in-list args)]
[i (in-naturals 1)])
(arg/c (add-list-context blame i))))
(λ (x)
(unless (list? x) (expected-a-list x blame))
(define actual (length x))
(expected-a-list-of-len x actual expected blame #:missing-party #f)
(for/list ([item (in-list x)]
[proj (in-list projs)])
(proj item)))))
(define (expected-a-list x blame #:missing-party [missing-party #f])
(raise-blame-error blame #:missing-party missing-party
x '(expected: "a list" given: "~e") x))
@ -1363,7 +1242,6 @@
#:generate list/c-generate
#:exercise list/c-exercise
#:stronger list/c-stronger
#:projection list/c-chaperone/other-projection
#:late-neg-projection list/c-chaperone/other-late-neg-projection
#:list-contract? (λ (c) #t)))
@ -1376,7 +1254,6 @@
#:generate list/c-generate
#:exercise list/c-exercise
#:stronger list/c-stronger
#:projection list/c-chaperone/other-projection
#:late-neg-projection list/c-chaperone/other-late-neg-projection
#:list-contract? (λ (c) #t)))
@ -1477,25 +1354,6 @@
#:omit-define-syntaxes
#:property prop:contract
(build-contract-property
#:projection
(λ (ctc)
(let* ([in-proc (contract-projection (parameter/c-in ctc))]
[out-proc (contract-projection (parameter/c-out ctc))])
(λ (blame)
(define blame/c (blame-add-context blame "the parameter of"))
(define (add-profiling f)
(λ (x) (with-contract-continuation-mark (cons blame #f) (f x))))
(define partial-neg-contract (add-profiling (in-proc (blame-swap blame/c))))
(define partial-pos-contract (add-profiling (out-proc blame/c)))
(λ (val)
(cond
[(parameter? val)
(make-derived-parameter
val
partial-neg-contract
partial-pos-contract)]
[else
(raise-blame-error blame val '(expected "a parameter"))])))))
#:late-neg-projection
(λ (ctc)
(define in-proc (get/build-late-neg-projection (parameter/c-in ctc)))
@ -1563,12 +1421,9 @@
n))
(make-procedure-arity-includes/c n))
(define (get-any-projection c) any-projection)
(define (any-projection b) any-function)
(define (any-function x) x)
(define (get-any? c) any?)
(define (any? x) #t)
(define any/c-blame->neg-party-fn (λ (blame) any/c-neg-party-fn))
(define any/c-neg-party-fn (λ (val neg-party) val))
(define (random-any/c env fuel)
@ -1608,8 +1463,7 @@
#:omit-define-syntaxes
#:property prop:flat-contract
(build-flat-contract-property
#:projection get-any-projection
#:late-neg-projection (λ (ctc) (λ (blame) any/c-neg-party-fn))
#:late-neg-projection (λ (ctc) any/c-blame->neg-party-fn)
#:stronger (λ (this that) (any/c? that))
#:name (λ (ctc) 'any/c)
#:generate (λ (ctc)
@ -1623,16 +1477,6 @@
(define-syntax (any stx)
(raise-syntax-error 'any "use of 'any' outside the range of an arrow contract" stx))
(define (none-curried-proj ctc)
(λ (blame)
(λ (val)
(raise-blame-error
blame
val
'("~s accepts no values" given: "~e")
(none/c-name ctc)
val))))
(define (((none-curried-late-neg-proj ctc) blame) val neg-party)
(raise-blame-error
blame #:missing-party neg-party
@ -1646,7 +1490,6 @@
#:omit-define-syntaxes
#:property prop:flat-contract
(build-flat-contract-property
#:projection none-curried-proj
#:late-neg-projection none-curried-late-neg-proj
#:stronger (λ (this that) #t)
#:name (λ (ctc) (none/c-name ctc))
@ -1680,42 +1523,6 @@
(list '#:call/cc) (base-prompt-tag/c-call/ccs ctc))))
;; build a projection for prompt tags
(define ((prompt-tag/c-proj chaperone?) ctc)
(define proxy (if chaperone? chaperone-prompt-tag impersonate-prompt-tag))
(define proc-proxy (if chaperone? chaperone-procedure impersonate-procedure))
(define ho-projs
(map contract-projection (base-prompt-tag/c-ctcs ctc)))
(define call/cc-projs
(map contract-projection (base-prompt-tag/c-call/ccs ctc)))
(λ (blame)
(define (make-proj projs swap?)
(λ vs
(define vs2 (for/list ([proj projs] [v vs])
((proj (if swap? (blame-swap blame) blame)) v)))
(apply values vs2)))
;; prompt/abort projections
(define proj1 (make-proj ho-projs #f))
(define proj2 (make-proj ho-projs #t))
;; call/cc projections
(define call/cc-guard (make-proj call/cc-projs #f))
(define call/cc-proxy
(λ (f)
(proc-proxy
f
(λ args
(apply values (make-proj call/cc-projs #t) args)))))
;; now do the actual wrapping
(λ (val)
(unless (contract-first-order-passes? ctc val)
(raise-blame-error
blame val
'(expected: "~s" given: "~e")
(contract-name ctc)
val))
(proxy val proj1 proj2 call/cc-guard call/cc-proxy
impersonator-prop:contracted ctc
impersonator-prop:blame blame))))
(define ((prompt-tag/c-late-neg-proj chaperone?) ctc)
(define proxy (if chaperone? chaperone-prompt-tag impersonate-prompt-tag))
(define proc-proxy (if chaperone? chaperone-procedure impersonate-procedure))
@ -1779,7 +1586,6 @@
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:late-neg-projection (prompt-tag/c-late-neg-proj #t)
#:projection (prompt-tag/c-proj #t)
#:first-order (λ (ctc) continuation-prompt-tag?)
#:stronger prompt-tag/c-stronger?
#:name prompt-tag/c-name))
@ -1789,7 +1595,6 @@
#:property prop:contract
(build-contract-property
#:late-neg-projection (prompt-tag/c-late-neg-proj #f)
#:projection (prompt-tag/c-proj #f)
#:first-order (λ (ctc) continuation-prompt-tag?)
#:stronger prompt-tag/c-stronger?
#:name prompt-tag/c-name))
@ -1808,23 +1613,6 @@
'continuation-mark-key/c
(base-continuation-mark-key/c-ctc ctc)))
(define ((continuation-mark-key/c-proj proxy) ctc)
(define ho-proj
(contract-projection (base-continuation-mark-key/c-ctc ctc)))
(λ (blame)
(define proj1 (ho-proj blame))
(define proj2 (ho-proj (blame-swap blame)))
(λ (val)
(unless (contract-first-order-passes? ctc val)
(raise-blame-error
blame val
'(expected: "~s" given: "~e")
(contract-name ctc)
val))
(proxy val proj1 proj2
impersonator-prop:contracted ctc
impersonator-prop:blame blame))))
(define ((continuation-mark-key/c-late-neg-proj proxy) ctc)
(define ho-proj
(get/build-late-neg-projection (base-continuation-mark-key/c-ctc ctc)))
@ -1864,7 +1652,6 @@
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:late-neg-projection (continuation-mark-key/c-late-neg-proj chaperone-continuation-mark-key)
#:projection (continuation-mark-key/c-proj chaperone-continuation-mark-key)
#:first-order (λ (ctc) continuation-mark-key?)
#:stronger continuation-mark-key/c-stronger?
#:name continuation-mark-key/c-name))
@ -1876,7 +1663,6 @@
#:property prop:contract
(build-contract-property
#:late-neg-projection (continuation-mark-key/c-late-neg-proj impersonate-continuation-mark-key)
#:projection (continuation-mark-key/c-proj impersonate-continuation-mark-key)
#:first-order (λ (ctc) continuation-mark-key?)
#:stronger continuation-mark-key/c-stronger?
#:name continuation-mark-key/c-name))
@ -1960,23 +1746,6 @@
'channel/c
(base-channel/c-ctc ctc)))
(define ((channel/c-proj proxy) ctc)
(define ho-proj
(contract-projection (base-channel/c-ctc ctc)))
(λ (blame)
(define proj1 (λ (ch) (values ch (λ (v) ((ho-proj blame) v)))))
(define proj2 (λ (ch v) ((ho-proj (blame-swap blame)) v)))
(λ (val)
(unless (contract-first-order-passes? ctc val)
(raise-blame-error
blame val
'(expected: "~s" given: "~e")
(contract-name ctc)
val))
(proxy val proj1 proj2
impersonator-prop:contracted ctc
impersonator-prop:blame blame))))
(define ((channel/c-late-neg-proj proxy) ctc)
(define ho-proj
(get/build-late-neg-projection (base-channel/c-ctc ctc)))
@ -2016,7 +1785,6 @@
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:late-neg-projection (channel/c-late-neg-proj chaperone-channel)
#:projection (channel/c-proj chaperone-channel)
#:first-order channel/c-first-order
#:stronger channel/c-stronger?
#:name channel/c-name))
@ -2027,7 +1795,6 @@
#:property prop:contract
(build-contract-property
#:late-neg-projection (channel/c-late-neg-proj impersonate-channel)
#:projection (channel/c-proj impersonate-channel)
#:first-order channel/c-first-order
#:stronger channel/c-stronger?
#:name channel/c-name))

View File

@ -72,17 +72,6 @@
(let ([r (loop (car rst) (cdr rst))])
(λ (x) (or (fst-pred x) (r x))))])))]))
(define (single-or/c-projection ctc)
(let ([c-proc (contract-projection (single-or/c-ho-ctc ctc))]
[pred (single-or/c-pred ctc)])
(λ (blame)
(define partial-contract
(c-proc (blame-add-or-context blame)))
(λ (val)
(cond
[(pred val) val]
[else (partial-contract val)])))))
(define (single-or/c-late-neg-projection ctc)
(define c-proj (get/build-late-neg-projection (single-or/c-ho-ctc ctc)))
(define c-first-order (contract-first-order (single-or/c-ho-ctc ctc)))
@ -218,7 +207,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:projection single-or/c-projection
#:late-neg-projection single-or/c-late-neg-projection
#:name single-or/c-name
#:first-order single-or/c-first-order
@ -233,7 +221,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:contract
(build-contract-property
#:projection single-or/c-projection
#:late-neg-projection single-or/c-late-neg-projection
#:name single-or/c-name
#:first-order single-or/c-first-order
@ -244,52 +231,6 @@
#:exercise (λ (ctc) (or/c-exercise (list (single-or/c-ho-ctc ctc))))
#:list-contract? single-or/c-list-contract?))
(define (multi-or/c-proj ctc)
(let* ([ho-contracts (multi-or/c-ho-ctcs ctc)]
[c-procs (map (λ (x) (contract-projection x)) ho-contracts)]
[first-order-checks (map (λ (x) (contract-first-order x)) ho-contracts)]
[predicates (map flat-contract-predicate (multi-or/c-flat-ctcs ctc))])
(λ (blame)
(define disj-blame (blame-add-or-context blame))
(define partial-contracts
(for/list ([c-proc (in-list c-procs)])
(c-proc disj-blame)))
(λ (val)
(cond
[(ormap (λ (pred) (pred val)) predicates)
val]
[else
(let loop ([checks first-order-checks]
[procs partial-contracts]
[contracts ho-contracts]
[candidate-proc #f]
[candidate-contract #f])
(cond
[(null? checks)
(if candidate-proc
(candidate-proc val)
(raise-none-or-matched blame val #f))]
[((car checks) val)
(if candidate-proc
(raise-blame-error blame val
'("two of the clauses in the or/c might both match: ~s and ~s"
given:
"~e")
(contract-name candidate-contract)
(contract-name (car contracts))
val)
(loop (cdr checks)
(cdr procs)
(cdr contracts)
(car procs)
(car contracts)))]
[else
(loop (cdr checks)
(cdr procs)
(cdr contracts)
candidate-proc
candidate-contract)]))])))))
(define (multi-or/c-late-neg-proj ctc)
(define ho-contracts (multi-or/c-ho-ctcs ctc))
(define c-projs (map get/build-late-neg-projection ho-contracts))
@ -376,7 +317,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:projection multi-or/c-proj
#:late-neg-projection multi-or/c-late-neg-proj
#:name multi-or/c-name
#:first-order multi-or/c-first-order
@ -391,7 +331,6 @@
#:property prop:custom-write custom-write-property-proc
#:property prop:contract
(build-contract-property
#:projection multi-or/c-proj
#:late-neg-projection multi-or/c-late-neg-proj
#:name multi-or/c-name
#:first-order multi-or/c-first-order
@ -453,31 +392,6 @@
(define-struct (flat-first-or/c flat-or/c) ())
(define (first-or/c-proj ctc)
(define contracts (base-first-or/c-ctcs ctc))
(define c-procs (map (λ (x) (contract-projection x)) contracts))
(define first-order-checks (map (λ (x) (contract-first-order x)) contracts))
(λ (blame)
(define disj-blame (blame-add-ior-context blame))
(define partial-contracts
(for/list ([c-proc (in-list c-procs)])
(c-proc disj-blame)))
(λ (val)
(let loop ([checks first-order-checks]
[procs partial-contracts]
[contracts contracts])
(cond
[(null? checks)
(raise-none-ior-matched blame val #f)]
[else
(cond
[((car checks) val)
((car procs) val)]
[else
(loop (cdr checks)
(cdr procs)
(cdr contracts))])])))))
(define (first-or/c-late-neg-proj ctc)
(define ho-contracts (base-first-or/c-ctcs ctc))
(define c-projs (map get/build-late-neg-projection ho-contracts))
@ -538,7 +452,6 @@
(define-struct (chaperone-first-or/c base-first-or/c) ()
#:property prop:chaperone-contract
(build-chaperone-contract-property
#:projection first-or/c-proj
#:late-neg-projection first-or/c-late-neg-proj
#:name first-or/c-name
#:first-order first-or/c-first-order
@ -549,7 +462,6 @@
(define-struct (impersonator-first-or/c base-first-or/c) ()
#:property prop:contract
(build-contract-property
#:projection first-or/c-proj
#:late-neg-projection first-or/c-late-neg-proj
#:name first-or/c-name
#:first-order first-or/c-first-order