edits to make- APIs for projections

mostly making the name of the #:first-order argument be first-order
This commit is contained in:
Robby Findler 2020-07-04 16:23:20 -05:00
parent d62526d290
commit ddacbfa174

View File

@ -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