313 lines
399 KiB
HTML
313 lines
399 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>8.7 Building New Contract Combinators</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="extras.css" title="default"/><link rel="stylesheet" type="text/css" href="../racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../doc-site.css" title="default"/><script type="text/javascript" src="../scribble-common.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../doc-site.js"></script><script type="text/javascript" src="../local-redirect/local-redirect.js"></script><script type="text/javascript" src="../local-redirect/local-user-redirect.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="doc-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">►</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Reference</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2 </td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3 </td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4 </td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5 </td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6 </td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7 </td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8 </td><td><a href="contracts.html" class="tocviewselflink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9 </td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10 </td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11 </td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12 </td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13 </td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18 </td><td><a href="runni
|
||
|
and <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a>, respectively. They all take the same set of three
|
||
|
optional arguments: a name, a first-order predicate, and a blame-tracking projection.
|
||
|
For <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._make-flat-contract%29%29" class="RktValLink" data-pltdoc="x">make-flat-contract</a></span>, see also <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._flat-contract-with-explanation%29%29" class="RktValLink" data-pltdoc="x">flat-contract-with-explanation</a></span>.</div></p><p>The <span class="RktVar">name</span> argument is any value to be rendered using <span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._display%29%29" class="RktValLink" data-pltdoc="x">display</a></span> to
|
||
|
describe the contract when a violation occurs. The default name for simple
|
||
|
higher-order contracts is <span class="RktRes">anonymous-contract</span>, for
|
||
|
<a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a> is <span class="RktRes">anonymous-chaperone-contract</span>, and for
|
||
|
<a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> is <span class="RktRes">anonymous-flat-contract</span>.</p><p>The first-order predicate <span class="RktVar">first-order</span> is used to determine which values
|
||
|
the contract applies to. This test is used
|
||
|
by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-first-order-passes~3f%29%29" class="RktValLink" data-pltdoc="x">contract-first-order-passes?</a></span>, and indirectly by <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span>
|
||
|
and <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._first-or%2Fc%29%29" class="RktValLink" data-pltdoc="x">first-or/c</a></span> to determine which higher-order contract to wrap a
|
||
|
value with when there are multiple higher-order contracts to choose from.
|
||
|
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 <span class="RktPn">(</span><span class="RktSym">contract-first-order-okay-to-give-up?</span><span class="RktPn">)</span> (see it’s documentation
|
||
|
for more explanation).</p><p>The <span class="RktVar">late-neg-proj</span> argument defines the behavior of applying
|
||
|
the contract via a <a name="(tech._late._neg._projection)"></a><span style="font-style: italic">late neg projection</span>. If it is supplied, this
|
||
|
argument accepts a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> that is missing one party (see also
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-missing-party~3f%29%29" class="RktValLink" data-pltdoc="x">blame-missing-party?</a></span>). Then it must return a function that accepts
|
||
|
both the value that is getting the contract and the name of the missing blame
|
||
|
party, in that order. The result must either be the value (perhaps suitably
|
||
|
wrapped with a <a href="chaperones.html#%28tech._chaperone%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone</span></a> or <a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a> to enforce the
|
||
|
contract), or signal a contract violation using <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._raise-blame-error%29%29" class="RktValLink" data-pltdoc="x">raise-blame-error</a></span>.
|
||
|
The default is <span class="RktVal">#f</span>.</p><p>The <span class="RktVar">collapsible-late-neg-proj</span> argument takes the place of the
|
||
|
<span class="RktVar">late-neg-proj</span> argument for contracts that support collapsing.
|
||
|
If it is supplied, this argument accepts a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> that is
|
||
|
missing one party. It must return two values. The first value must be
|
||
|
a function that accepts both the value that is getting the contract and
|
||
|
the name of the missing blame party, in that order. The second value should
|
||
|
be a <a href="collapsible.html#%28tech._collapsible._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">collapsible</span></a> representation of the contract.</p><p>The projection <span class="RktVar">proj</span> and <span class="RktVar">val-first-proj</span> are older mechanisms for
|
||
|
defining the behavior of applying the contract. The <span class="RktVar">proj</span> argument
|
||
|
is a curried function of two arguments: the first application accepts a blame
|
||
|
object, and the second accepts a value to protect with the contract. The
|
||
|
projection must either produce the value, suitably wrapped to enforce any
|
||
|
higher-order aspects of the contract, or signal a contract violation using
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._raise-blame-error%29%29" class="RktValLink" data-pltdoc="x">raise-blame-error</a></span>. The default projection produces an error when the
|
||
|
first-order test fails, and produces the value unchanged otherwise.
|
||
|
The <span class="RktVar">val-first-proj</span> is like <span class="RktVar">late-neg-proj</span>, except with
|
||
|
an extra layer of currying.</p><p>At least one of the <span class="RktVar">late-neg-proj</span>, <span class="RktVar">proj</span>,
|
||
|
<span class="RktVar">val-first-proj</span>, or <span class="RktVar">first-order</span> must be non-<span class="RktVal">#f</span>.</p><p>The projection arguments (<span class="RktVar">late-neg-proj</span>, <span class="RktVar">proj</span>, and
|
||
|
<span class="RktVar">val-first-proj</span>) must be in sync with the <span class="RktVar">first-order</span> argument.
|
||
|
In particular, if the <span class="RktVar">first-order</span> argument returns <span class="RktVal">#f</span> for some value,
|
||
|
then the projections must raise a blame error for that value and if the
|
||
|
<span class="RktVar">first-order</span> argument returns <span class="RktVal">#t</span> for some value, then the projection must
|
||
|
not signal any blame for this value, unless there are higher-order interactions
|
||
|
later. In other words, for <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a>, the <span class="RktVar">first-order</span> and
|
||
|
<span class="RktSym">projection</span> arguments must check the same predicate. For convenience, the
|
||
|
the default projection uses the <span class="RktVar">first-order</span> argument, signalling an error
|
||
|
when it returns <span class="RktVal">#f</span> and never signalling one otherwise.</p><p>Projections for <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a> must produce a value that passes
|
||
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-of~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone-of?</a></span> when compared with the original, uncontracted value.
|
||
|
Projections for <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> must fail precisely when <span class="RktVar">first-order</span>
|
||
|
does, and must produce the input value unchanged otherwise. Applying a
|
||
|
<a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract</span></a> may result in either an application of the predicate, or the
|
||
|
projection, or both; therefore, the two must be consistent. The existence of a
|
||
|
separate projection only serves to provide more specific error messages. Most
|
||
|
<a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> do not need to supply an explicit projection.</p><p>The <span class="RktVar">stronger</span> argument is used to implement <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span>. The
|
||
|
first argument is always the contract itself and the second argument is whatever
|
||
|
was passed as the second argument to <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span>. If no
|
||
|
<span class="RktVar">stronger</span> argument is supplied, then a default that compares its arguments
|
||
|
with <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> is used for <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> and <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a>.
|
||
|
For <a href="contracts.html#%28tech._impersonator._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator contracts</span></a> constructed with <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._make-contract%29%29" class="RktValLink" data-pltdoc="x">make-contract</a></span> that do not
|
||
|
supply the <span class="RktVar">stronger</span> argument, <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span> returns <span class="RktVal">#f</span>.</p><p>Similarly, the <span class="RktVar">equivalent</span> argument is used to implement <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-equivalent~3f%29%29" class="RktValLink" data-pltdoc="x">contract-equivalent?</a></span>.
|
||
|
If it isn’t supplied or <span class="RktVal">#false</span> is supplied, then <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> is used
|
||
|
for chaperone and flat contracts, and <span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._~ce~bb%29%29" class="RktStxLink" data-pltdoc="x">λ</a></span><span class="stt"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="stt"> </span><span class="RktSym">y</span><span class="RktPn">)</span><span class="stt"> </span><span class="RktVal">#f</span><span class="RktPn">)</span> is used otherwise.</p><p>The <span class="RktVar">is-list-contract?</span> argument is used by the <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._list-contract~3f%29%29" class="RktValLink" data-pltdoc="x">list-contract?</a></span> predicate
|
||
|
to determine if this is a contract that accepts only <span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._list~3f%29%29" class="RktValLink" data-pltdoc="x">list?</a></span> values.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">int/c</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._make-flat-contract%29%29" class="RktValLink" data-pltdoc="x">make-flat-contract</a></span><span class="hspace"> </span><span class="RktPn">#:name</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">int/c</span><span class="hspace"> </span><span class="RktPn">#:first-order</span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="attaching-contracts-to-values.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fbase..rkt%29._contract%29%29" class="RktStxLink" data-pltdoc="x">contract</a></span><span class="hspace"> </span><span class="RktSym">int/c</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">positive</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">negative</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">1</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="attaching-contracts-to-values.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fbase..rkt%29._contract%29%29" class="RktStxLink" data-pltdoc="x">contract</a></span><span class="hspace"> </span><span class="RktSym">int/c</span><span class="hspace"> </span><span class="RktVal">"not one"</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">positive</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">negative</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktErr">eval:4:0: broke its own contract</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">promised: int/c</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">produced: "not one"</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">in: int/c</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">contract from: positive</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">blaming: positive</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">(assuming the contract is correct)</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">int/c</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span></td></tr><tr><td>
|
||
|
for a contract. The arguments should be either contracts or
|
||
|
symbols. It wraps parentheses around its arguments and
|
||
|
extracts the names from any contracts it is supplied with.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-contract</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Converts a regular Racket value into an instance of a contract struct,
|
||
|
converting it according to the description of <a href="contracts.html#%28tech._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">contracts</span></a>.</div></p><p>If <span class="RktVar">v</span> is not one of the coercible values,
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%29%29" class="RktValLink" data-pltdoc="x">coerce-contract</a></span> signals an error, using the first argument in
|
||
|
the error message.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-contracts))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contracts%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-contracts</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">vs</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vs</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Coerces all of the arguments in <span class="RktVar">vs</span> into contracts (via
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%2Ff%29%29" class="RktValLink" data-pltdoc="x">coerce-contract/f</a></span>) and signals an error if any of them are not
|
||
|
contracts. The error messages assume that the function named by
|
||
|
<span class="RktVar">id</span> got <span class="RktVar">vs</span> as its entire argument list.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-chaperone-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-chaperone-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-chaperone-contract</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._chaperone-contract~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone-contract?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%29%29" class="RktValLink" data-pltdoc="x">coerce-contract</a></span>, but requires the result
|
||
|
to be a <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contract</span></a>, not an arbitrary contract.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-chaperone-contracts))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-chaperone-contracts%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-chaperone-contracts</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">vs</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._chaperone-contract~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone-contract?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vs</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contracts%29%29" class="RktValLink" data-pltdoc="x">coerce-contracts</a></span>, but requires the results
|
||
|
to be <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a>, not arbitrary contracts.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-flat-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-flat-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-flat-contract</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._flat-contract~3f%29%29" class="RktValLink" data-pltdoc="x">flat-contract?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%29%29" class="RktValLink" data-pltdoc="x">coerce-contract</a></span>, but requires the result
|
||
|
to be a <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract</span></a>, not an arbitrary contract.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-flat-contracts))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-flat-contracts%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-flat-contracts</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._flat-contract~3f%29%29" class="RktValLink" data-pltdoc="x">flat-contract?</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contracts%29%29" class="RktValLink" data-pltdoc="x">coerce-contracts</a></span>, but requires the results
|
||
|
to be <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a>, not arbitrary contracts.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._coerce-contract/f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%2Ff%29%29" class="RktValDef RktValLink" data-pltdoc="x">coerce-contract/f</a></span></span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._coerce-contract%29%29" class="RktValLink" data-pltdoc="x">coerce-contract</a></span>, but returns <span class="RktVal">#f</span> if
|
||
|
the value cannot be coerced to a contract.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/combinator..rkt)._skip-projection-wrapper~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._skip-projection-wrapper~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">skip-projection-wrapper?</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._skip-projection-wrapper~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">skip-projection-wrapper?</a></span></span><span class="hspace"> </span><span class="RktVar">wrap?</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">wrap?</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span>=<span class="hspace"> </span></td><td valign="top"><span class="RktVal">#f</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">The functions <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._make-chaperone-contract%29%29" class="RktValLink" data-pltdoc="x">make-chaperone-contract</a></span> and
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-chaperone-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-chaperone-contract-property</a></span> wrap their
|
||
|
arguments to ensure that the result of the projections
|
||
|
are chaperones of the input. This layer of wrapping can,
|
||
|
in some cases, introduce unwanted overhead into contract
|
||
|
checking. If this parameter’s value is <span class="RktVal">#t</span>
|
||
|
during the dynamic extent of the call to either of those
|
||
|
functions, the wrapping (and thus the checks) are skipped.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/contract/private/guts..rkt)._with-contract-continuation-mark))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._with-contract-continuation-mark%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">with-contract-continuation-mark</a></span></span><span class="hspace"> </span><span class="RktVar">blame</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._with-contract-continuation-mark%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">with-contract-continuation-mark</a></span><span class="hspace"> </span><span class="RktVar">blame+neg-party</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Inserts a continuation mark that informs the contract profiler (see
|
||
|
<a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?tag=%28part._%28.%27%28lib._contract-profile%2Fscribblings%2Fcontract-profile..scrbl%29.%27._.%27top.%27%29%29&version=8.6" class="Sq" data-pltdoc="x">the contract profiling documentation</a>)
|
||
|
that contract checking is happening.
|
||
|
For the costs from checking your new combinator to be included, you should wrap
|
||
|
any deferred, higher-order checks with this form. First-order checks are
|
||
|
recognized automatically and do not require this form.</div></p><p>If your combinator’s projections operate on complete <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame objects</span></a> (i.e., no
|
||
|
missing blame parties), the <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> should be the first argument to this
|
||
|
form. Otherwise (e.g., in the case of <span class="RktVar">late-neg</span> projections), a pair
|
||
|
of the <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> and the missing party should be used instead.</p><p class="SHistory">Added in version 6.4.0.4 of package <span class="stt">base</span>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/contract/private/guts..rkt)._contract-pos/neg-doubling))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-pos%2Fneg-doubling%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">contract-pos/neg-doubling</a></span></span><span class="hspace"> </span><span class="RktVar">e1</span><span class="hspace"> </span><span class="RktVar">e2</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Some contract combinators need to build projections for
|
||
|
subcontracts with both regular and <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-swap%29%29" class="RktValLink" data-pltdoc="x">blame-swap</a></span>ed
|
||
|
versions of the blame that they are given in order to check
|
||
|
both access and mutations (e.g., <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fvector..rkt%29._vector%2Fc%29%29" class="RktValLink" data-pltdoc="x">vector/c</a></span> and
|
||
|
<span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fvector..rkt%29._vectorof%29%29" class="RktValLink" data-pltdoc="x">vectorof</a></span>). In the case that such combinators are
|
||
|
nested deeply inside each other, there is a potential for an
|
||
|
exponential explosion of nested projections being built.</div></p><p>To avoid that explosion, wrap each of the calls to the
|
||
|
blame-accepting portion of the combinator in
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-pos%2Fneg-doubling%29%29" class="RktStxLink" data-pltdoc="x">contract-pos/neg-doubling</a></span>. It returns three values.
|
||
|
The first is a boolean, indicating how to interpret the
|
||
|
other two results. If the boolean is <span class="RktVal">#t</span>, then the
|
||
|
other two results are the values of <span class="RktVar">e1</span> and
|
||
|
<span class="RktVar">e2</span> and we are not too deep in the nesting. If the
|
||
|
boolean is <span class="RktVal">#f</span>, then we have passed a threshold and
|
||
|
it is not safe to evaluate <span class="RktVar">e1</span> and <span class="RktVar">e2</span> yet,
|
||
|
as we are in danger of running into the exponential
|
||
|
slowdown. In that case, the last two results are thunks
|
||
|
that, when invoked, compute the values of <span class="RktVar">e1</span> and
|
||
|
<span class="RktVar">e2</span>.</p><p>As an example, <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fvector..rkt%29._vectorof%29%29" class="RktValLink" data-pltdoc="x">vectorof</a></span> uses
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-pos%2Fneg-doubling%29%29" class="RktStxLink" data-pltdoc="x">contract-pos/neg-doubling</a></span> wrapping its two calls to
|
||
|
the blame-accepting part of the projection for its
|
||
|
subcontract. When it receives a <span class="RktVal">#f</span> as that first
|
||
|
boolean, it does not invoke the thunks right away, but waits
|
||
|
until the interposition procedure that it attaches to the
|
||
|
chaperoned vector is called. Then it invokes them (and caches
|
||
|
the result). This delays the construction of the projections
|
||
|
until they are actually needed, avoiding the exponential blowup.</p><p class="SHistory">Added in version 6.90.0.27 of package <span class="stt">base</span>.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Blame_Objects"">8.7.1<tt> </tt><a name="(part._.Blame_.Objects)"></a>Blame Objects</h5><p>This section describes <a name="(tech._blame._object)"></a><span style="font-style: italic">blame objects</span> and operations on them.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame?</a></span></span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This predicate recognizes <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame objects</span></a>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._raise-blame-error))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._raise-blame-error%29%29" class="RktValDef RktValLink" data-pltdoc="x">raise-blame-error</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">b</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:missing-party</span><span class="hspace"> </span><span class="RktVar">missing-party</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">v</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace
|
||
|
current blame information, including positive and negative parties, the name of
|
||
|
the contract, the name of the value, and the source location of the contract
|
||
|
application. The <span class="RktPn">#:missing-party</span> argument supplies one of the blame
|
||
|
parties. It should be non-<span class="RktVal">#f</span> when the <span class="RktVar">b</span> object was created
|
||
|
without supplying a negative party. See <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-missing-party%29%29" class="RktValLink" data-pltdoc="x">blame-add-missing-party</a></span> and
|
||
|
the description of the <span class="RktVar">late-neg-proj</span> argument of <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._make-contract%29%29" class="RktValLink" data-pltdoc="x">make-contract</a></span>.</div></p><p>The second positional argument, <span class="RktVar">v</span>, is the value that failed to
|
||
|
satisfy the contract.</p><p>The remaining arguments are a format string,
|
||
|
<span class="RktVar">fmt</span>, and its arguments, <span class="RktVar">v-fmt</span><span class="stt"> </span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span>, specifying an error message
|
||
|
specific to the precise violation.</p><p>If <span class="RktVar">fmt</span> is a list, then the elements are concatenated together
|
||
|
(with spaces added, unless there are already spaces at the ends of the strings),
|
||
|
after first replacing symbols with either their string counterparts, or
|
||
|
replacing <span class="RktVal">'</span><span class="RktVal">given</span> with <span class="RktVal">"produced"</span> and
|
||
|
<span class="RktVal">'</span><span class="RktVal">expected</span> with <span class="RktVal">"promised"</span>, depending on whether or not
|
||
|
the <span class="RktVar">b</span> argument has been swapped or not (see <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-swap%29%29" class="RktValLink" data-pltdoc="x">blame-swap</a></span>).</p><p>If <span class="RktVar">fmt</span> contains the symbols <span class="RktVal">'</span><span class="RktVal">given:</span> or <span class="RktVal">'</span><span class="RktVal">expected:</span>,
|
||
|
they are replaced like <span class="RktVal">'</span><span class="RktVal">given</span> and <span class="RktVal">'</span><span class="RktVal">expected</span> are, but
|
||
|
the replacements are prefixed with the string <span class="RktVal">"\n<span class="hspace"> </span>"</span> to conform
|
||
|
to the error message guidelines in <a href="exns.html#%28part._err-msg-conventions%29" data-pltdoc="x">Error Message Conventions</a>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-add-context))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-context%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-add-context</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">blame</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">context</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:important</span><span class="hspace"> </span><span class="RktVar">important</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:swap?</span><span class="hspace"> </span><span class="RktVar">swap?</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">blame</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">context</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">important</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href=
|
||
|
that explicates which portion of the contract failed
|
||
|
(and that gets rendered by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._raise-blame-error%29%29" class="RktValLink" data-pltdoc="x">raise-blame-error</a></span>).</div></p><p>The <span class="RktVar">context</span> argument describes one layer of the
|
||
|
portion of the contract, typically of the form <span class="RktVal">"the 1st argument of"</span>
|
||
|
(in the case of a function contract)
|
||
|
or <span class="RktVal">"a conjunct of"</span> (in the case of an <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._and%2Fc%29%29" class="RktValLink" data-pltdoc="x">and/c</a></span> contract).</p><p><div class="SIntrapara">For example, consider this contract violation:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="attaching-contracts-to-values.html#%28form._%28%28lib._racket%2Fcontract%2Fregion..rkt%29._define%2Fcontract%29%29" class="RktStxLink" data-pltdoc="x">define/contract</a></span><span class="hspace"> </span><span class="RktSym">f</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._list%2Fc%29%29" class="RktValLink" data-pltdoc="x">list/c</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._~ce~bb%29%29" class="RktStxLink" data-pltdoc="x">λ</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._car%29%29" class="RktValLink" data-pltdoc="x">car</a></span><span class="hspace"> </span><span class="RktSym">f</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktErr">f: contract violation</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">expected: integer?</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">given: #f</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">in: the 1st argument of</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">the 1st element of</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">(list/c (-> integer? integer?))</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">contract from: (definition f)</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">blaming: top-level</span></p></td></tr><tr><td><p><span cla
|
||
|
occurrence of <span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span>, because the <span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span> and
|
||
|
the <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._list%2Fc%29%29" class="RktValLink" data-pltdoc="x">list/c</a></span> combinators each internally called
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-context%29%29" class="RktValLink" data-pltdoc="x">blame-add-context</a></span> to add the two lines following
|
||
|
“in” in the error message.</div></p><p>The <span class="RktVar">important</span> argument is used to build the beginning part
|
||
|
of the contract violation. The last <span class="RktVar">important</span> argument that
|
||
|
gets added to a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> is used. The <span class="RktSym"><a href="Object_and_Class_Contracts.html#%28form._%28%28lib._racket%2Fclass..rkt%29._class%2Fc%29%29" class="RktStxLink" data-pltdoc="x">class/c</a></span> contract
|
||
|
adds an important argument, as does the <span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span> contract (when
|
||
|
<span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span> knows the name of the function getting the contract).</p><p>The <span class="RktVar">swap?</span> argument has the effect of calling <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-swap%29%29" class="RktValLink" data-pltdoc="x">blame-swap</a></span>
|
||
|
while adding the layer of context, but without creating an extra
|
||
|
<a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a>.</p><p>Passing <span class="RktVal">#f</span> as the context string argument is no longer relevant.
|
||
|
For backwards compatibility, <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-context%29%29" class="RktValLink" data-pltdoc="x">blame-add-context</a></span> returns <span class="RktSym">b</span>
|
||
|
when <span class="RktVar">context</span> is <span class="RktVal">#f</span>.</p><p class="SHistory">Changed in version 6.90.0.29 of package <span class="stt">base</span>: The <span class="RktVar">context</span> argument being
|
||
|
<span class="RktVal">#f</span> is no longer relevant.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-context))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-context%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-context</a></span></span><span class="hspace"> </span><span class="RktVar">blame</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">blame</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns the context information that would be supplied in
|
||
|
an error message, if <span class="RktVar">blame</span> is passed to <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._raise-blame-error%29%29" class="RktValLink" data-pltdoc="x">raise-blame-error</a></span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-positive))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-positive%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-positive</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-negative))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-negative%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-negative</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">These functions produce printable descriptions of the current positive and
|
||
|
negative parties of a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-contract</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This function produces a description of the contract associated with a blame
|
||
|
object (the result of <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-name%29%29" class="RktValLink" data-pltdoc="x">contract-name</a></span>).</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-value))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-value%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-value</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This function produces the name of the value to which the contract was applied,
|
||
|
or <span class="RktVal">#f</span> if no name was provided.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-source))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-source%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-source</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="exns.html#%28def._%28%28quote._~23~25kernel%29._srcloc~3f%29%29" class="RktValLink" data-pltdoc="x">srcloc?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This function produces the source location associated with a contract. If no
|
||
|
source location was provided, all fields of the structure will contain
|
||
|
<span class="RktVal">#f</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-swap))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-swap%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-swap</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This function swaps the positive and negative parties of a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a>.
|
||
|
(See also <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-context%29%29" class="RktValLink" data-pltdoc="x">blame-add-context</a></span>.)</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-original~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-original~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-original?</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-swapped~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-swapped~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-swapped?</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">These functions report whether the current blame of a given <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> is the
|
||
|
same as in the original contract invocation (possibly of a compound contract
|
||
|
containing the current one), or swapped, respectively. Each is the negation of
|
||
|
the other; both are provided for convenience and clarity.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-replace-negative))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-replace-negative%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-replace-negative</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span><span class="RktVar">neg</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">neg</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Produces a <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span> object just like <span class="RktVar">b</span> except
|
||
|
that it uses <span class="RktVar">neg</span> instead of the negative
|
||
|
position <span class="RktVar">b</span> has.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-replaced-negative~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-replaced-negative~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-replaced-negative?</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> if <span class="RktVar">b</span> is the result of calling
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-replace-negative%29%29" class="RktValLink" data-pltdoc="x">blame-replace-negative</a></span> (or the result of some other function
|
||
|
whose input was the result of <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-replace-negative%29%29" class="RktValLink" data-pltdoc="x">blame-replace-negative</a></span>).</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-update))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-update%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-update</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span><span class="RktVar">pos</span><span class="hspace"> </span><span class="RktVar">neg</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">pos</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">neg</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Produces a <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span> object just like <span class="RktVar">b</span> except
|
||
|
that it adds <span class="RktVar">pos</span> and <span class="RktVar">neg</span> to the positive
|
||
|
and negative parties of <span class="RktVar">b</span> respectively.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-missing-party~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-missing-party~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-missing-party?</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> when <span class="RktVar">b</span> does not have both parties.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._blame-add-missing-party))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-missing-party%29%29" class="RktValDef RktValLink" data-pltdoc="x">blame-add-missing-party</a></span></span><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span><span class="RktVar">missing-party</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._and%2Fc%29%29" class="RktValLink" data-pltdoc="x">and/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._not%2Fc%29%29" class="RktValLink" data-pltdoc="x">not/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-missing-party~3f%29%29" class="RktValLink" data-pltdoc="x">blame-missing-party?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._and%2Fc%29%29" class="RktValLink" data-pltdoc="x">and/c</a></span><span
|
||
|
party is replaced with <span class="RktVar">missing-party</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" cellpadding="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace"> </span></td><td><a name="(def._((lib._racket/contract/private/blame..rkt)._exn~3afail~3acontract~3ablame-object))"></a><a name="(def._((lib._racket/contract/private/blame..rkt)._make-exn~3afail~3acontract~3ablame))"></a><a name="(def._((lib._racket/contract/private/blame..rkt)._exn~3afail~3acontract~3ablame~3f))"></a><a name="(def._((lib._racket/contract/private/blame..rkt)._struct~3aexn~3afail~3acontract~3ablame))"></a><a name="(def._((lib._racket/contract/private/blame..rkt)._exn~3afail~3acontract~3ablame))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._exn~3afail~3acontract~3ablame%29%29" class="RktValDef RktValLink" data-pltdoc="x">exn:fail:contract:blame</a></span></span><span class="hspace"> </span><span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3acontract%29%29" class="RktValLink" data-pltdoc="x">exn:fail:contract</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">object</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">#:extra-constructor-name</span><span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._make-exn~3afail~3acontract~3ablame%29%29" class="RktValLink" data-pltdoc="x">make-exn:fail:contract:blame</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym">object</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This exception is raised to signal a contract error. The <span class="RktSym">object</span>
|
||
|
field contains a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> associated with a contract violation.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/blame..rkt)._current-blame-format))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._current-blame-format%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-blame-format</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._current-blame-format%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-blame-format</a></span></span><span class="hspace"> </span><span class="RktVar">proc</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame~3f%29%29" class="RktValLink" data-pltdoc="x">blame?</a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?<
|
||
|
contract violation error. Its value is procedure that
|
||
|
accepts three arguments:
|
||
|
</div><div class="SIntrapara"><ul><li><p>the <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a> for the violation,</p></li><li><p>the value that the contract applies to, and</p></li><li><p>a message indicating the kind of violation.</p></li></ul></div><div class="SIntrapara">The procedure then
|
||
|
returns a string that is put into the contract error
|
||
|
message. Note that the value is often already included in
|
||
|
the message that indicates the violation.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">show-blame-error</span><span class="hspace"> </span><span class="RktSym">blame</span><span class="hspace"> </span><span class="RktSym">value</span><span class="hspace"> </span><span class="RktSym">message</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string-append%29%29" class="RktValLink" data-pltdoc="x">string-append</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktVal">"Contract Violation!\n"</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"Guilty Party: ~a\n"</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-positive%29%29" class="RktValLink" data-pltdoc="x">blame-positive</a></span><span class="hspace"> </span><span class="RktSym">blame</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"Innocent Party: ~a\n"</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-negative%29%29" class="RktValLink" data-pltdoc="x">blame-negative</a></span><span class="hspace"> </span><span class="RktSym">blame</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"Contracted Value Name: ~a\n"</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-value%29%29" class="RktValLink" data-pltdoc="x">blame-value</a></span><span class="hspace"> </span><span class="RktSym">blame</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace"> </span><span class="RktVal">"Contract Location: ~s\n"</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fpr
|
||
|
contracts. The property <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span> allows arbitrary
|
||
|
structures to act as <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a>; <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span>
|
||
|
inherits <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3acontract%29%29" class="RktValLink" data-pltdoc="x">prop:contract</a></span>, so <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contract</span></a> structures may also act
|
||
|
as general contracts. The property <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3aflat-contract%29%29" class="RktValLink" data-pltdoc="x">prop:flat-contract</a></span> allows arbitrary structures
|
||
|
to act as <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a>; <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3aflat-contract%29%29" class="RktValLink" data-pltdoc="x">prop:flat-contract</a></span> inherits both
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span> and <span class="RktSym"><a href="procedures.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._prop~3aprocedure%29%29" class="RktValLink" data-pltdoc="x">prop:procedure</a></span>, so <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract</span></a> structures
|
||
|
may also act as <a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contracts</span></a>, as general contracts, and as predicate procedures.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/prop..rkt)._prop~3acontract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3acontract%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:contract</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property?</a></span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/prop..rkt)._prop~3achaperone-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property?</a></span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/prop..rkt)._prop~3aflat-contract))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3aflat-contract%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:flat-contract</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property?</a></span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">These properties declare structures to be contracts or <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a>,
|
||
|
respectively. The value for <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3acontract%29%29" class="RktValLink" data-pltdoc="x">prop:contract</a></span> must be a <a href="Building_New_Contract_Combinators.html#%28tech._contract._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">contract
|
||
|
property</span></a> constructed by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._build-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-contract-property</a></span>; likewise, the value
|
||
|
for <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span> must be a <a href="Building_New_Contract_Combinators.html#%28tech._chaperone._contract._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contract property</span></a>
|
||
|
constructed by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-chaperone-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-chaperone-contract-property</a></span> and the value
|
||
|
for <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3aflat-contract%29%29" class="RktValLink" data-pltdoc="x">prop:flat-contract</a></span> must be a <a href="Building_New_Contract_Combinators.html#%28tech._flat._contract._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract property</span></a>
|
||
|
constructed by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-flat-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-flat-contract-property</a></span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/guts..rkt)._prop~3acontracted))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._prop~3acontracted%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:contracted</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property?</a></span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/guts..rkt)._impersonator-prop~3acontracted))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._impersonator-prop~3acontracted%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-prop:contracted</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-property?</a></span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">These properties attach a contract value to the protected structure,
|
||
|
chaperone, or impersonator value. The function <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._has-contract~3f%29%29" class="RktValLink" data-pltdoc="x">has-contract?</a></span>
|
||
|
returns <span class="RktVal">#t</span> for values that have one of these properties, and
|
||
|
<span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._value-contract%29%29" class="RktValLink" data-pltdoc="x">value-contract</a></span> extracts the value from the property (which
|
||
|
is expected to be the contract on the value).</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/guts..rkt)._prop~3ablame))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._prop~3ablame%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:blame</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property?</a></span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._((lib._racket/contract/private/guts..rkt)._impersonator-prop~3ablame))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._impersonator-prop~3ablame%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-prop:blame</a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-property?</a></span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">These properties attach a blame information to the protected structure,
|
||
|
chaperone, or impersonator value. The function <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._has-blame~3f%29%29" class="RktValLink" data-pltdoc="x">has-blame?</a></span>
|
||
|
returns <span class="RktVal">#t</span> for values that have one of these properties, and
|
||
|
<span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._value-blame%29%29" class="RktValLink" data-pltdoc="x">value-blame</a></span> extracts the value from the property.</div></p><p>The value is expected to be the blame record for the contract on the value or
|
||
|
a <span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span>-pair of a blame record with a missing party and the missing
|
||
|
party. The <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._value-blame%29%29" class="RktValLink" data-pltdoc="x">value-blame</a></span> function reassembles the arguments of the pair
|
||
|
into a complete blame record using <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fblame..rkt%29._blame-add-missing-party%29%29" class="RktValLink" data-pltdoc="x">blame-add-missing-party</a></span>. If
|
||
|
the value has one of the properties, but the value is not a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a>
|
||
|
or a pair whose <span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._car%29%29" class="RktValLink" data-pltdoc="x">car</a></span> position is a <a href="Building_New_Contract_Combinators.html#%28tech._blame._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">blame object</span></a>, then <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._has-blame~3f%29%29" class="RktValLink" data-pltdoc="x">has-blame?</a></span>
|
||
|
returns <span class="RktVal">#f</span> but <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._value-blame%29%29" class="RktValLink" data-pltdoc="x">value-blame</a></span> returns <span class="RktVal">#f</span>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top" colspan="3"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/combinator..rkt)._build-flat-contract-property))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-flat-contract-property%29%29" class="RktValDef RktValLink" data-pltdoc="x">build-flat-contract-property</a></span></span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:name</span><span class="hspace"> </span><span class="RktVar">get-name</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:first-order</span><span class="hspace"> </span><span class="RktVar">get-first-order</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:late-neg-projection</span><span class="hspace"> </span><span class="RktVar">late-neg-proj</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:collapsible-late-neg-projection</span><span class="hspace"> </span><span class="RktVar">collapsible-late-neg-proj</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:val-first-projection</span><span class="hspace"> </span><span class="RktVar">val-first-proj</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:projection</span><span class="hspace"> </span><span class="RktVar">get-projection</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:stronger</span><span class="hspace"> </span><span class="RktVar">stronger</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:equivalent</span><span class="hspace"> </span><span class="RktVar">equivalent</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:generate</span><span class="hspace"> </span><span class="RktVar">generate</span></td><td valign="top"><span class="hspace">&
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3achaperone-contract%29%29" class="RktValLink" data-pltdoc="x">prop:chaperone-contract</a></span>, and <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._prop~3aflat-contract%29%29" class="RktValLink" data-pltdoc="x">prop:flat-contract</a></span>, respectively.</div></p><p><div class="SIntrapara">A <a name="(tech._contract._property)"></a><span style="font-style: italic">contract property</span> specifies the behavior of a structure when used as
|
||
|
a contract. It is specified in terms of seven properties:
|
||
|
</div><div class="SIntrapara"><ul><li><p><span class="RktVar">get-name</span> which produces a description to <span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29" class="RktValLink" data-pltdoc="x">write</a></span> as part
|
||
|
of a contract violation;</p></li><li><p><span class="RktVar">get-first-order</span>, which produces a first-order predicate to be
|
||
|
used by <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-first-order-passes~3f%29%29" class="RktValLink" data-pltdoc="x">contract-first-order-passes?</a></span>;</p></li><li><p><span class="RktVar">late-neg-proj</span>, which produces a blame-tracking projection
|
||
|
defining the behavior of the contract (The <span class="RktVar">get-projection</span>
|
||
|
and <span class="RktVar">val-first-proj</span> arguments also specify the projection,
|
||
|
but using a different signature. They are here for backwards compatibility.);</p></li><li><p><span class="RktVar">collapsible-late-neg-proj</span>, similar to <span class="RktVar">late-neg-proj</span>
|
||
|
which produces a blame-tracking projection defining the behavior of the
|
||
|
contract, this function additionally specifies the
|
||
|
<a href="collapsible.html#%28tech._collapsible._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">collapsible</span></a> behavior of the contract;</p></li><li><p><span class="RktVar">stronger</span>, a predicate that determines whether this
|
||
|
contract (passed in the first argument) is stronger than some other
|
||
|
contract (passed in the second argument) and whose default always
|
||
|
returns <span class="RktVal">#f</span>;</p></li><li><p><span class="RktVar">equivalent</span>, a predicate that determines whether this
|
||
|
contract (passed in the first argument) is equivalent to some other
|
||
|
contract (passed in the second argument); the default for flat
|
||
|
and chaperone contracts is <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> and for impersonator contracts
|
||
|
returns <span class="RktVal">#f</span>;</p></li><li><p><span class="RktVar">generate</span>, which returns a thunk that generates random values
|
||
|
matching the contract (using <span class="RktSym"><a href="Random_generation.html#%28def._%28%28lib._racket%2Fcontract..rkt%29._contract-random-generate-fail%29%29" class="RktValLink" data-pltdoc="x">contract-random-generate-fail</a></span>)
|
||
|
to indicate failure) or <span class="RktVal">#f</span> to indicate that random
|
||
|
generation for this contract isn’t supported;</p></li><li><p><span class="RktVar">exercise</span>, which returns a function that exercises values
|
||
|
matching the contract (e.g., if it is a function contract, it may call
|
||
|
the function) and a list of contracts whose values will be generated
|
||
|
by this process;</p></li><li><p>and <span class="RktVar">is-list-contract?</span>, which is used by <span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._flat-contract~3f%29%29" class="RktValLink" data-pltdoc="x">flat-contract?</a></span>
|
||
|
to determine if this contract accepts only <span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._list~3f%29%29" class="RktValLink" data-pltdoc="x">list?</a></span>s.</p></li></ul></div></p><p>At least one of the <span class="RktVar">late-neg-proj</span>, <span class="RktVar">collapsible-late-neg-proj</span>,
|
||
|
<span class="RktVar">get-projection</span>, <span class="RktVar">val-first-proj</span>, or <span class="RktVar">get-first-order</span>
|
||
|
must be non-<span class="RktVal">#f</span>.</p><p>These accessors are passed as (optional) keyword arguments to
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._build-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-contract-property</a></span>, and are applied to instances of the
|
||
|
appropriate structure type by the contract system. Their results are used
|
||
|
analogously to the arguments of <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._make-contract%29%29" class="RktValLink" data-pltdoc="x">make-contract</a></span>.</p><p>A <a name="(tech._chaperone._contract._property)"></a><span style="font-style: italic">chaperone contract property</span> specifies the behavior of a structure
|
||
|
when used as a chaperone contract. It is specified using
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-chaperone-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-chaperone-contract-property</a></span>, and accepts exactly the same set of
|
||
|
arguments as <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._build-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-contract-property</a></span>. The only difference is that the
|
||
|
projection accessor must return a value that passes <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-of~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone-of?</a></span> when
|
||
|
compared with the original, uncontracted value.</p><p><div class="SIntrapara">A <a name="(tech._flat._contract._property)"></a><span style="font-style: italic">flat contract property</span> specifies the behavior of a structure when
|
||
|
used as a <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract</span></a>. It is specified using
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._build-flat-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-flat-contract-property</a></span>, and accepts similar
|
||
|
arguments as <span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._build-contract-property%29%29" class="RktValLink" data-pltdoc="x">build-contract-property</a></span>. The differences are:
|
||
|
</div><div class="SIntrapara"><ul><li><p>the projection accessor is expected not to wrap its argument in a
|
||
|
higher-order fashion, analogous to the constraint on projections in
|
||
|
<span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fcombinator..rkt%29._make-flat-contract%29%29" class="RktValLink" data-pltdoc="x">make-flat-contract</a></span>;</p></li><li><p>the <span class="RktPn">#:exercise</span> keyword argument is omitted because it is not
|
||
|
relevant for flat contracts.</p></li></ul></div></p><p class="SHistory">Changed in version 6.0.1.13 of package <span class="stt">base</span>: Added the <span class="RktPn">#:list-contract?</span> argument.<br/>Changed in version 6.1.1.4: Allow <span class="RktVar">generate</span> to return <span class="RktSym"><a href="Random_generation.html#%28def._%28%28lib._racket%2Fcontract..rkt%29._contract-random-generate-fail%29%29" class="RktValLink" data-pltdoc="x">contract-random-generate-fail</a></span>.<br/>Changed in version 6.90.0.30: Added the <span class="RktPn">#:equivalent</span> argument.<br/>Changed in version 7.1.0.10: Added the <span class="RktPn">#:collapsible-late-neg-projection</span> argument.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/prop..rkt)._contract-property~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._contract-property~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">contract-property?</a></span></span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/prop..rkt)._chaperone-contract-property~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fprop..rkt%29._chaperone-contract-property~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-contract-property?</a></span></span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/prop..rkt)._flat-contract-property~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="Rk
|
||
|
<a href="Building_New_Contract_Combinators.html#%28tech._chaperone._contract._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone contract property</span></a>, or a
|
||
|
<a href="Building_New_Contract_Combinators.html#%28tech._flat._contract._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract property</span></a>, respectively.</div></p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Obligation_Information_in_Check_Syntax"">8.7.3<tt> </tt><a name="(part._.Obligation_.Information_in_.Check_.Syntax)"></a>Obligation Information in Check Syntax</h5><p><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?tag=%28part._%28.%27%28lib._scribblings%2Fdrracket%2Fdrracket..scrbl%29.%27._.%27buttons.%27%29%29&version=8.6" class="Sq" data-pltdoc="x">Check Syntax</a> in DrRacket shows obligation information for
|
||
|
contracts according to <span class="RktSym"><a href="stxprops.html#%28def._%28%28quote._~23~25kernel%29._syntax-property%29%29" class="RktValLink" data-pltdoc="x">syntax-property</a></span>s that the contract combinators
|
||
|
leave in the expanded form of the program. These properties indicate
|
||
|
where contracts appear in the source and where the positive and negative
|
||
|
positions of the contracts appear.</p><p>To make Check Syntax show obligation information for your new contract
|
||
|
combinators, use the following properties (some helper macros and functions
|
||
|
are below):</p><ul><li><p><div class="SIntrapara"><a name="(idx._(gentag._197._(lib._scribblings/reference/reference..scrbl)))"></a>
|
||
|
</div><div class="SIntrapara"><span class="RktVal">'</span><span class="RktVal">racket/contract:contract</span><span class="hspace"> </span><span class="RktSym">:</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fvector..rkt%29._vector%2Fc%29%29" class="RktValLink" data-pltdoc="x">vector/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax~3f%29%29" class="RktValLink" data-pltdoc="x">syntax?</a></span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax~3f%29%29" class="RktValLink" data-pltdoc="x">syntax?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></div><div class="SIntrapara">This property should be attached to the result of a transformer
|
||
|
that implements a contract combinator. It signals to Check Syntax
|
||
|
that this is where a contract begins.</div></p><p>The first element in the
|
||
|
vector should be a unique (in the sense of <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._eq~3f%29%29" class="RktValLink" data-pltdoc="x">eq?</a></span>) value
|
||
|
that Check Syntax can use a tag to match up this contract with
|
||
|
its subpieces (specified by the two following syntax properties).</p><p>The second and third elements of the vector are syntax objects
|
||
|
from pieces of the contract, and Check Syntax will color them.
|
||
|
The first list should contain subparts that are the responsibility
|
||
|
of parties (typically modules) that provide implementations of the contract.
|
||
|
The second list should contain subparts that are the
|
||
|
responsibility of clients.</p><p>For example, in <span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%2A%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span>*</a></span><span class="stt"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="stt"> </span><span class="RktPn">#:pre</span><span class="stt"> </span><span class="RktVal">#t</span><span class="stt"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="stt"> </span><span class="RktPn">#:post</span><span class="stt"> </span><span class="RktVal">#t</span><span class="RktPn">)</span>,
|
||
|
the <span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%2A%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span>*</a></span> and the <span class="RktPn">#:post</span> should be in the first
|
||
|
list and <span class="RktPn">#:pre</span> in the second list.</p></li><li><p><div class="SIntrapara"><a name="(idx._(gentag._198._(lib._scribblings/reference/reference..scrbl)))"></a>
|
||
|
</div><div class="SIntrapara"><span class="RktVal">'</span><span class="RktVal">racket/contract:negative-position</span><span class="hspace"> </span><span class="RktSym">:</span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></div><div class="SIntrapara">This property should be attached to sub-expressions of
|
||
|
a contract combinator that are expected to be other contracts.
|
||
|
The value of the property should be the key (the first element from
|
||
|
the vector for the <span class="RktVal">'</span><span class="RktVal">racket/contract:contract</span> property)
|
||
|
indicating which contract this is.</div></p><p>This property should be used when the expression’s value is a contract
|
||
|
that clients are responsible for. </p></li><li><p><div class="SIntrapara"><a name="(idx._(gentag._199._(lib._scribblings/reference/reference..scrbl)))"></a>
|
||
|
</div><div class="SIntrapara"><span class="RktVal">'</span><span class="RktVal">racket/contract:positive-position</span><span class="hspace"> </span><span class="RktSym">:</span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></div><div class="SIntrapara">This form is just like <span class="RktVal">'</span><span class="RktVal">racket/contract:negative-position</span>,
|
||
|
except that it should be used when the expression’s value is
|
||
|
a contract that the original party should be responsible for.</div></p></li><li><p><div class="SIntrapara"><a name="(idx._(gentag._200._(lib._scribblings/reference/reference..scrbl)))"></a>
|
||
|
</div><div class="SIntrapara"><span class="RktVal">'</span><span class="RktVal">racket/contract:contract-on-boundary</span><span class="hspace"> </span><span class="RktSym">:</span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></div><div class="SIntrapara">The presence of this property tells Check Syntax that it
|
||
|
should start coloring from this point. It expects the expression
|
||
|
to be a contract
|
||
|
(and, thus, to have the <span class="RktVal">'</span><span class="RktVal">racket/contract:contract</span> property);
|
||
|
this property indicates that this contract is on a (module) boundary.</div></p><p>(The value of the property is not used.)</p></li><li><p><div class="SIntrapara"><a name="(idx._(gentag._201._(lib._scribblings/reference/reference..scrbl)))"></a>
|
||
|
</div><div class="SIntrapara"><span class="RktVal">'</span><span class="RktVal">racket/contract:internal-contract</span><span class="hspace"> </span><span class="RktSym">:</span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></div><div class="SIntrapara">Like <span class="RktVal">'</span><span class="RktVal">racket/contract:contract-on-boundary</span>, the presence
|
||
|
of this property triggers coloring, but this is meant for use
|
||
|
when the party (module) containing the contract (regardless of whether
|
||
|
or not this module exports anything matching the contract)
|
||
|
can be blamed for violating the contract. This comes into play
|
||
|
for <span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3ei%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span>i</a></span> contracts, since the contract itself has
|
||
|
access to values under contract via the dependency.</div></p></li></ul><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/contract/private/guts..rkt)._define/final-prop))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._define%2Ffinal-prop%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">define/final-prop</a></span></span><span class="hspace"> </span><span class="RktVar">header</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="stt"> </span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">header</span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">=</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktVar">main-id</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktVar">main-id</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktVar">main-id</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktVar">id</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">The same as <span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="stt"> </span><span class="RktVar">header</span><span class="stt"> </span><span class="RktVar">body</span><span class="stt"> </span><span class="RktMeta"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span><span class="RktPn">)</span>, except that uses of
|
||
|
<span class="RktVar">main-id</span> in the header are annotated
|
||
|
with the <span class="RktVal">'</span><span class="RktVal">racket/contract:contract</span> property
|
||
|
(as above).</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/contract/private/guts..rkt)._define/subexpression-pos-prop))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._define%2Fsubexpression-pos-prop%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">define/subexpression-pos-prop</a></span></span><span class="hspace"> </span><span class="RktVar">header</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="stt"> </span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">header</span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">=</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktVar">main-id</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktVar">main-id</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktVar">main-id</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktVar">id</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">The same as <span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="stt"> </span><span class="RktVar">header</span><span class="stt"> </span><span class="RktVar">body</span><span class="stt"> </span><span class="RktMeta"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span><span class="RktPn">)</span>, except that uses of
|
||
|
<span class="RktVar">main-id</span> in the header are annotated
|
||
|
with the <span class="RktVal">'</span><span class="RktVal">racket/contract:contract</span> property
|
||
|
(as above) and arguments are annotated with the
|
||
|
<span class="RktVal">'</span><span class="RktVal">racket/contract:positive-position</span> property.</div></p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Utilities_for_Building_New_Combinators"">8.7.4<tt> </tt><a name="(part._.Utilities_for_.Building_.New_.Combinators)"></a>Utilities for Building New Combinators</h5><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._contract-stronger~3f))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">contract-stronger?</a></span></span><span class="hspace"> </span><span class="RktVar">c1</span><span class="hspace"> </span><span class="RktVar">c2</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">c1</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">c2</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> if the contract <span class="RktVar">c1</span> accepts either fewer
|
||
|
or the same set of values that <span class="RktVar">c2</span> does.</div></p><p><a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">Chaperone contracts</span></a> and <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> that are the same
|
||
|
(i.e., where <span class="RktVar">c1</span> is <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> to <span class="RktVar">c2</span>) are
|
||
|
considered to always be stronger than each other.</p><p>This function is conservative, so it may return <span class="RktVal">#f</span> when
|
||
|
<span class="RktVar">c1</span> does, in fact, accept fewer values.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._between%2Fc%29%29" class="RktValLink" data-pltdoc="x">between/c</a></span><span class="hspace"> </span><span class="RktVal">25</span><span class="hspace"> </span><span class="RktVal">75</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._between%2Fc%29%29" class="RktValLink" data-pltdoc="x">between/c</a></span><span class="hspace"> </span><span class="RktVal">0</span><span class="hspace"> </span><span class="RktVal">100</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._between%2Fc%29%29" class="RktValLink" data-pltdoc="x">between/c</a></span><span class="hspace"> </span><span class="RktVal">0</span><span class="hspace"> </span><span class="RktVal">100</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._between%2Fc%29%29" class="RktValLink" data-pltdoc="x">between/c</a></span><span class="hspace"> </span><span class="RktVal">25</span><span class="hspace"> </span><span class="RktVal">75</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#f</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-stronger~3f%29%29" class="RktValLink" data-pltdoc="x">contract-stronger?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._between%2Fc%29%29" class="RktValLink" data-pltdoc="x">between/c</a></span><span class="hspace"> </span><span class="RktVal"><span class="nobreak">-1</span>0</span><span class="hspace"> </span><sp
|
||
|
set of values that <span class="RktVar">c2</span> does.</div></p><p><a href="contracts.html#%28tech._chaperone._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">Chaperone contracts</span></a> and <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contracts</span></a> that are the same
|
||
|
(i.e., where <span class="RktVar">c1</span> is <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> to <span class="RktVar">c2</span>) are
|
||
|
considered to always be equivalent to each other.</p><p>This function is conservative, so it may return <span class="RktVal">#f</span> when
|
||
|
<span class="RktVar">c1</span> does, in fact, accept the same set of values that <span class="RktVar">c2</span> does.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-equivalent~3f%29%29" class="RktValLink" data-pltdoc="x">contract-equivalent?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-equivalent~3f%29%29" class="RktValLink" data-pltdoc="x">contract-equivalent?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._non-empty-listof%29%29" class="RktValLink" data-pltdoc="x">non-empty-listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._cons%2Fc%29%29" class="RktValLink" data-pltdoc="x">cons/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-equivalent~3f%29%29" class="RktValLink" data-pltdoc="x">contract-equivalent?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._~ce~bb%29%29" class="RktStxLink" data-pltdoc="x">λ</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._and%29%29" class="RktStxLink" data-pltdoc="x">and</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="
|
||
|
of <span class="RktVar">contract</span> pass for <span class="RktVar">v</span>.</div></p><p>If it returns <span class="RktVal">#f</span>, the contract is guaranteed not to
|
||
|
hold for that value; if it returns <span class="RktVal">#t</span>, the contract
|
||
|
may or may not hold. If the contract is a first-order
|
||
|
contract, a result of <span class="RktVal">#t</span> guarantees that the
|
||
|
contract holds.</p><p>See also <span class="RktSym">contract-first-order-okay-to-give-up?</span> and
|
||
|
<span class="RktSym">contract-first-order-try-less-hard</span>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/contract/private/guts..rkt)._contract-first-order))"></a><span title="Provided from: racket/contract/combinator, racket/contract, racket | Package: base"><span class="RktSym"><a href="Building_New_Contract_Combinators.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract-first-order%29%29" class="RktValDef RktValLink" data-pltdoc="x">contract-first-order</a></span></span><span class="hspace"> </span><span class="RktVar">c</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">c</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="contract-utilities.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fguts..rkt%29._contract~3f%29%29" class="RktValLink" data-pltdoc="x">contract?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Produces the first-order test used by <span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span> to match values to
|
||
|
higher-order contracts.</div></p><div class="navsetbottom"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, "8.6", "../");"/></form> <a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot("8.6");">top</a><span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="attaching-contracts-to-values.html" title="backward to "8.6 Attaching Contracts to Values"" data-pltdoc="x">← prev</a> <a href="contracts.html" title="up to "8 Contracts"" data-pltdoc="x">up</a> <a href="contract-utilities.html" title="forward to "8.8 Contract Utilities"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html>
|