edits to make- APIs for projections
mostly making the name of the #:first-order argument be first-order
This commit is contained in:
parent
d62526d290
commit
ddacbfa174
|
@ -2289,7 +2289,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
@deftogether[(
|
@deftogether[(
|
||||||
@defproc[(make-contract
|
@defproc[(make-contract
|
||||||
[#:name name any/c 'anonymous-contract]
|
[#:name name any/c 'anonymous-contract]
|
||||||
[#:first-order test (-> any/c any/c) (λ (x) #t)]
|
[#:first-order first-order (-> any/c any/c) (λ (x) #t)]
|
||||||
[#:late-neg-projection
|
[#:late-neg-projection
|
||||||
late-neg-proj
|
late-neg-proj
|
||||||
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
||||||
|
@ -2305,7 +2305,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
[#:projection proj (-> blame? (-> any/c any/c))
|
[#:projection proj (-> blame? (-> any/c any/c))
|
||||||
(λ (b)
|
(λ (b)
|
||||||
(λ (x)
|
(λ (x)
|
||||||
(if (test x)
|
(if (first-order x)
|
||||||
x
|
x
|
||||||
(raise-blame-error
|
(raise-blame-error
|
||||||
b x
|
b x
|
||||||
|
@ -2321,7 +2321,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
contract?]
|
contract?]
|
||||||
@defproc[(make-chaperone-contract
|
@defproc[(make-chaperone-contract
|
||||||
[#:name name any/c 'anonymous-chaperone-contract]
|
[#:name name any/c 'anonymous-chaperone-contract]
|
||||||
[#:first-order test (-> any/c any/c) (λ (x) #t)]
|
[#:first-order first-order (-> any/c any/c) (λ (x) #t)]
|
||||||
[#:late-neg-projection
|
[#:late-neg-projection
|
||||||
late-neg-proj
|
late-neg-proj
|
||||||
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
||||||
|
@ -2337,7 +2337,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
[#:projection proj (-> blame? (-> any/c any/c))
|
[#:projection proj (-> blame? (-> any/c any/c))
|
||||||
(λ (b)
|
(λ (b)
|
||||||
(λ (x)
|
(λ (x)
|
||||||
(if (test x)
|
(if (first-order x)
|
||||||
x
|
x
|
||||||
(raise-blame-error
|
(raise-blame-error
|
||||||
b x
|
b x
|
||||||
|
@ -2353,7 +2353,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
chaperone-contract?]
|
chaperone-contract?]
|
||||||
@defproc[(make-flat-contract
|
@defproc[(make-flat-contract
|
||||||
[#:name name any/c 'anonymous-flat-contract]
|
[#:name name any/c 'anonymous-flat-contract]
|
||||||
[#:first-order test (-> any/c any/c) (λ (x) #t)]
|
[#:first-order first-order (-> any/c any/c) (λ (x) #t)]
|
||||||
[#:late-neg-projection
|
[#:late-neg-projection
|
||||||
late-neg-proj
|
late-neg-proj
|
||||||
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
(or/c #f (-> blame? (-> any/c any/c any/c)))
|
||||||
|
@ -2369,7 +2369,7 @@ accepted by the third argument to @racket[datum->syntax].
|
||||||
[#:projection proj (-> blame? (-> any/c any/c))
|
[#:projection proj (-> blame? (-> any/c any/c))
|
||||||
(λ (b)
|
(λ (b)
|
||||||
(λ (x)
|
(λ (x)
|
||||||
(if (test x)
|
(if (first-order x)
|
||||||
x
|
x
|
||||||
(raise-blame-error
|
(raise-blame-error
|
||||||
b x
|
b x
|
||||||
|
@ -2396,12 +2396,13 @@ higher-order contracts is @racketresult[anonymous-contract], for
|
||||||
@tech{chaperone contracts} is @racketresult[anonymous-chaperone-contract], and for
|
@tech{chaperone contracts} is @racketresult[anonymous-chaperone-contract], and for
|
||||||
@tech{flat contracts} is @racketresult[anonymous-flat-contract].
|
@tech{flat contracts} is @racketresult[anonymous-flat-contract].
|
||||||
|
|
||||||
The first-order predicate @racket[test] is used to determine which values
|
The first-order predicate @racket[first-order] is used to determine which values
|
||||||
the contract applies to. This test is used
|
the contract applies to. This test is used
|
||||||
by @racket[contract-first-order-passes?], and indirectly by @racket[or/c]
|
by @racket[contract-first-order-passes?], and indirectly by @racket[or/c]
|
||||||
and @racket[from-or/c] to determine which higher-order contract to wrap a
|
and @racket[first-or/c] to determine which higher-order contract to wrap a
|
||||||
value with when there are multiple higher-order contracts to choose from.
|
value with when there are multiple higher-order contracts to choose from.
|
||||||
The default test accepts any value. The predicate should be influenced by
|
The default value accepts any value, but it must match the behavior of the
|
||||||
|
projection argument (see below for how). The predicate should be influenced by
|
||||||
the value of @racket[(contract-first-order-okay-to-give-up?)] (see it's documentation
|
the value of @racket[(contract-first-order-okay-to-give-up?)] (see it's documentation
|
||||||
for more explanation).
|
for more explanation).
|
||||||
|
|
||||||
|
@ -2435,21 +2436,22 @@ The @racket[val-first-proj] is like @racket[late-neg-proj], except with
|
||||||
an extra layer of currying.
|
an extra layer of currying.
|
||||||
|
|
||||||
At least one of the @racket[late-neg-proj], @racket[proj],
|
At least one of the @racket[late-neg-proj], @racket[proj],
|
||||||
@racket[val-first-proj], or @racket[test] must be non-@racket[#f].
|
@racket[val-first-proj], or @racket[first-order] must be non-@racket[#f].
|
||||||
|
|
||||||
The projection arguments (@racket[late-neg-proj], @racket[proj], and
|
The projection arguments (@racket[late-neg-proj], @racket[proj], and
|
||||||
@racket[val-first-proj]) must be in sync with the @racket[test] argument.
|
@racket[val-first-proj]) must be in sync with the @racket[first-order] argument.
|
||||||
In particular, if the test argument returns @racket[#f] for some value,
|
In particular, if the @racket[first-order] argument returns @racket[#f] for some value,
|
||||||
then the projections must raise a blame error for that value and if the
|
then the projections must raise a blame error for that value and if the
|
||||||
test argument returns @racket[#t] for some value, then the projection must
|
@racket[first-order] argument returns @racket[#t] for some value, then the projection must
|
||||||
not signal any blame for this value, unless there are higher-order interactions
|
not signal any blame for this value, unless there are higher-order interactions
|
||||||
later. In other words, for @tech{flat contracts}, the @racket[test] and
|
later. In other words, for @tech{flat contracts}, the @racket[first-order] and
|
||||||
@racket[projection] arguments must check the same predicate (which is
|
@racket[projection] arguments must check the same predicate. For convenience, the
|
||||||
why thee default projection uses the @racket[test] argument directly).
|
the default projection uses the @racket[first-order] argument, signalling an error
|
||||||
|
when it returns @racket[#f] and never signalling one otherwise.
|
||||||
|
|
||||||
Projections for @tech{chaperone contracts} must produce a value that passes
|
Projections for @tech{chaperone contracts} must produce a value that passes
|
||||||
@racket[chaperone-of?] when compared with the original, uncontracted value.
|
@racket[chaperone-of?] when compared with the original, uncontracted value.
|
||||||
Projections for @tech{flat contracts} must fail precisely when the first-order test
|
Projections for @tech{flat contracts} must fail precisely when @racket[first-order]
|
||||||
does, and must produce the input value unchanged otherwise. Applying a
|
does, and must produce the input value unchanged otherwise. Applying a
|
||||||
@tech{flat contract} may result in either an application of the predicate, or the
|
@tech{flat contract} may result in either an application of the predicate, or the
|
||||||
projection, or both; therefore, the two must be consistent. The existence of a
|
projection, or both; therefore, the two must be consistent. The existence of a
|
||||||
|
|
Loading…
Reference in New Issue
Block a user