469 lines
No EOL
340 KiB
HTML
469 lines
No EOL
340 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>14.5 Impersonators and Chaperones</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="tocviewlink" 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="tocviewselflink" 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="running.html" class="tocviewlink" data-pltdoc="x">Running Racket</a></td></tr><tr><td align="right"></td><td><a href="doc-bibliography.html" class="tocviewlink" data-pltdoc="x">Bibliography</a></td></tr><tr><td align="right"></td><td><a href="doc-index.html" class="tocviewlink" data-pltdoc="x">Index</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_1");">▼</a></td><td>14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr></table><div class="tocviewsublist" style="display: block;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">14.1 </td><td><a href="Namespaces.html" class="tocviewlink" data-pltdoc="x">Namespaces</a></td></tr><tr><td align="right">14.2 </td><td><a href="eval.html" class="tocviewlink" data-pltdoc="x">Evaluation and Compilation</a></td></tr><tr><td align="right">14.3 </td><td><a href="load-lang.html" class="tocviewlink" data-pltdoc="x">The <span class="RktModLink"><span class="RktSym">racket/<span class="mywbr"> </span>load</span></span> Language</a></td></tr><tr><td align="right">14.4 </td><td><a href="Module_Names_and_Loading.html" class="tocviewlink" data-pltdoc="x">Module Names and Loading</a></td></tr><tr><td align="right">14.5 </td><td><a href="chaperones.html" class="tocviewselflink" data-pltdoc="x">Impersonators and Chaperones</a></td></tr><tr><td align="right">14.6 </td><td><a href="securityguards.html" class="tocviewlink" data-pltdoc="x">Security Guards</a></td></tr><tr><td align="right">14.7 </td><td><a href="custodians.html" class="tocviewlink" data-pltdoc="x">Custodians</a></td></tr><tr><td align="right">14.8 </td><td><a href="threadgroups.html" class="tocviewlink" data-pltdoc="x">Thread Groups</a></td></tr><tr><td align="right">14.9 </td><td><a href="inspectors.html" class="tocviewlink" data-pltdoc="x">Structure Inspectors</a></td></tr><tr><td align="right">14.10 </td><td><a href="modprotect.html" class="tocviewlink" data-pltdoc="x">Code Inspectors</a></td></tr><tr><td align="right">14.11 </td><td><a href="plumbers.html" class="tocviewlink" data-pltdoc="x">Plumbers</a></td></tr><tr><td align="right">14.12 </td><td><a href="Sandboxed_Evaluation.html" class="tocviewlink" data-pltdoc="x">Sandboxed Evaluation</a></td></tr><tr><td align="right">14.13 </td><td><a href="repl-module.html" class="tocviewlink" data-pltdoc="x">The <span class="RktModLink"><span class="RktSym">racket/<span class="mywbr"> </span>repl</span></span> Library</a></td></tr><tr><td align="right">14.14 </td><td><a href="linklets.html" class="tocviewlink" data-pltdoc="x">Linklets and the Core Compiler</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_2");">►</a></td><td>14.5 </td><td><a href="chaperones.html" class="tocviewselflink" data-pltdoc="x">Impersonators and Chaperones</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_2"><table cellspacing="0" cellpadding="0"><tr><td align="right">14.5.1 </td><td><a href="chaperones.html#%28part._.Impersonator_.Constructors%29" class="tocviewlink" data-pltdoc="x">Impersonator Constructors</a></td></tr><tr><td align="right">14.5.2 </td><td><a href="chaperones.html#%28part._.Chaperone_.Constructors%29" class="tocviewlink" data-pltdoc="x">Chaperone Constructors</a></td></tr><tr><td align="right">14.5.3 </td><td><a href="chaperones.html#%28part._.Impersonator_.Properties%29" class="tocviewlink" data-pltdoc="x">Impersonator Properties</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator-<wbr></wbr>of?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-of~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>of?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-ephemeron%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator-<wbr></wbr>ephemeron</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._procedure-impersonator%2A~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">procedure-<wbr></wbr>impersonator*?</span></span></a></td></tr><tr><td><span class="tocsublinknumber">14.5.1<tt> </tt></span><a href="chaperones.html#%28part._.Impersonator_.Constructors%29" class="tocsubseclink" data-pltdoc="x">Impersonator Constructors</a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>procedure</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>procedure*</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>struct</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>vector</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%2A%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>vector*</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-box%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>box</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-hash%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>hash</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-channel%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>channel</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-prompt-tag%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>prompt-<wbr></wbr>tag</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-continuation-mark-key%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonate-<wbr></wbr>continuation-<wbr></wbr>mark-<wbr></wbr>key</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">prop:<span class="mywbr"> </span>impersonator-<wbr></wbr>of</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aauthentic%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">prop:<span class="mywbr"> </span>authentic</span></span></a></td></tr><tr><td><span class="tocsublinknumber">14.5.2<tt> </tt></span><a href="chaperones.html#%28part._.Chaperone_.Constructors%29" class="tocsubseclink" data-pltdoc="x">Chaperone Constructors</a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>procedure</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%2A%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>procedure*</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>struct</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-vector%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>vector</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-vector%2A%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>vector*</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-box%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>box</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-hash%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>hash</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct-type%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>struct-<wbr></wbr>type</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-evt%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>evt</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-channel%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>channel</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-prompt-tag%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>prompt-<wbr></wbr>tag</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-continuation-mark-key%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">chaperone-<wbr></wbr>continuation-<wbr></wbr>mark-<wbr></wbr>key</span></span></a></td></tr><tr><td><span class="tocsublinknumber">14.5.3<tt> </tt></span><a href="chaperones.html#%28part._.Impersonator_.Properties%29" class="tocsubseclink" data-pltdoc="x">Impersonator Properties</a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._make-impersonator-property%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">make-<wbr></wbr>impersonator-<wbr></wbr>property</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator-<wbr></wbr>property?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-accessor-procedure~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator-<wbr></wbr>property-<wbr></wbr>accessor-<wbr></wbr>procedure?</span></span></a></td></tr><tr><td><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-prop~3aapplication-mark%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">impersonator-<wbr></wbr>prop:<span class="mywbr"> </span>application-<wbr></wbr>mark</span></span></a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="navsettop"><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="Module_Names_and_Loading.html" title="backward to "14.4 Module Names and Loading"" data-pltdoc="x">← prev</a> <a href="security.html" title="up to "14 Reflection and Security"" data-pltdoc="x">up</a> <a href="securityguards.html" title="forward to "14.6 Security Guards"" data-pltdoc="x">next →</a></span> </div><h4 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""chaperones"">14.5<tt> </tt><a name="(part._chaperones)"></a>Impersonators and Chaperones</h4><p>An <a name="(tech._impersonator)"></a><span style="font-style: italic">impersonator</span> is a wrapper for a value where the wrapper
|
|
redirects some of the value’s operations. Impersonators apply only to procedures,
|
|
<a href="structures.html#%28tech._structure%29" class="techoutside" data-pltdoc="x"><span class="techinside">structures</span></a> for which an accessor or mutator is available,
|
|
<a href="structures.html#%28tech._structure._type%29" class="techoutside" data-pltdoc="x"><span class="techinside">structure types</span></a>, <a href="hashtables.html#%28tech._hash._table%29" class="techoutside" data-pltdoc="x"><span class="techinside">hash tables</span></a>, <a href="vectors.html#%28tech._vector%29" class="techoutside" data-pltdoc="x"><span class="techinside">vectors</span></a>,
|
|
<a href="boxes.html#%28tech._box%29" class="techoutside" data-pltdoc="x"><span class="techinside">box</span></a>es, <a href="channel.html#%28tech._channel%29" class="techoutside" data-pltdoc="x"><span class="techinside">channels</span></a>, and <a href="eval-model.html#%28tech._prompt._tag%29" class="techoutside" data-pltdoc="x"><span class="techinside">prompt tag</span></a>s.
|
|
An impersonator 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 the original
|
|
value, but not <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> to the original value.</p><p>A <a name="(tech._chaperone)"></a><span style="font-style: italic">chaperone</span> is a kind of impersonator whose refinement of a value’s
|
|
operation is restricted to side effects (including, in particular,
|
|
raising an exception) or chaperoning values supplied to or produced by
|
|
the operation. For example, a vector chaperone can redirect
|
|
<span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span> to raise an exception if the accessed vector slot
|
|
contains a string, or it can cause the result of <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span>
|
|
to be a chaperoned variant of the value that is in the accessed vector
|
|
slot, but it cannot redirect <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span> to produce a value
|
|
that is arbitrarily different from the value in the vector slot.</p><p>A non-<a href="chaperones.html#%28tech._chaperone%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone</span></a> <a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a>, in contrast, can refine an operation to swap one
|
|
value for any other. An impersonator cannot be applied to an immutable value
|
|
or refine the access to an immutable field in an instance of a <a href="structures.html#%28tech._structure._type%29" class="techoutside" data-pltdoc="x"><span class="techinside">structure
|
|
type</span></a>, since arbitrary redirection of an operation amounts to
|
|
mutation of the impersonated value.</p><p>Beware that each of the following operations can be redirected to an
|
|
arbitrary procedure through an impersonator on the operation’s
|
|
argument—<wbr></wbr>assuming that the operation is available to the creator of
|
|
the impersonator:</p><ul class="compact"><li><p>a structure-field accessor</p></li><li><p>a structure-field mutator</p></li><li><p>a structure type property accessor</p></li><li><p>application of a procedure</p></li><li><p><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._unbox%29%29" class="RktValLink" data-pltdoc="x">unbox</a></span></p></li><li><p><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._set-box%21%29%29" class="RktValLink" data-pltdoc="x">set-box!</a></span></p></li><li><p><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span></p></li><li><p><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-set%21%29%29" class="RktValLink" data-pltdoc="x">vector-set!</a></span></p></li><li><p><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span></p></li><li><p><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span></p></li><li><p><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span></p></li><li><p><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span></p></li><li><p><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%21%29%29" class="RktValLink" data-pltdoc="x">hash-remove!</a></span></p></li><li><p><span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-get%29%29" class="RktValLink" data-pltdoc="x">channel-get</a></span></p></li><li><p><span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-put%29%29" class="RktValLink" data-pltdoc="x">channel-put</a></span></p></li><li><p><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span></p></li><li><p><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span></p></li></ul><p>Derived operations, such as printing a value, can be redirected
|
|
through impersonators due to their use of accessor functions. The
|
|
<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>, <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-hash-code</a></span>, and
|
|
<span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-secondary-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-secondary-hash-code</a></span> operations, in contrast, may bypass
|
|
impersonators (but they are not obliged to).</p><p>In addition to redirecting operations that work on a value, a
|
|
impersonator can include <a name="(tech._impersonator._property)"></a><span style="font-style: italic">impersonator properties</span> for an impersonated
|
|
value. An <a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator property</span></a> is similar to a <a href="structprops.html#%28tech._structure._type._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">structure
|
|
type property</span></a>, but it applies to impersonators instead of structure
|
|
types and their instances.</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._((quote._~23~25kernel)._impersonator~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator?</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">Returns <span class="RktVal">#t</span> if <span class="RktVar">v</span> is an <a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a> created by
|
|
procedures like <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span> or
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="RktValLink" data-pltdoc="x">impersonate-struct</a></span>, <span class="RktVal">#f</span> otherwise.</div></p><p>Programs and libraries generally should avoid <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span> and
|
|
treat impersonators the same as non-impersonator values. In rare cases,
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span> may be needed to guard against redirection by an
|
|
impersonator of an operation to an arbitrary procedure.</p><p>A limitation of <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span> is that it does <span class="emph">not</span>
|
|
recognize an <a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a> that is created by instantiating a
|
|
structure type with the <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValLink" data-pltdoc="x">prop:impersonator-of</a></span> property. The
|
|
limitation reflects how those impersonators cannot redirect structure
|
|
access and mutation operations to arbitrary procedures.</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._((quote._~23~25kernel)._chaperone~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone?</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">Returns <span class="RktVal">#t</span> if <span class="RktVar">v</span> is a <a href="chaperones.html#%28tech._chaperone%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone</span></a>, <span class="RktVal">#f</span> otherwise.</div></p><p>Programs and libraries generally should avoid <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span> for
|
|
the same reason that they should avoid <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span>. A true
|
|
value for <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span> implies a true value of
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></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._((quote._~23~25kernel)._impersonator-of~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-of?</a></span></span><span class="hspace"> </span><span class="RktVar">v1</span><span class="hspace"> </span><span class="RktVar">v2</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">v1</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">v2</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">Indicates whether <span class="RktVar">v1</span> can be considered equivalent modulo
|
|
impersonators to <span class="RktVar">v2</span>.</div></p><p>Any two values that are <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> to one another are also <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span>.
|
|
For values that include no impersonators, <span class="RktVar">v1</span> and <span class="RktVar">v2</span> are
|
|
considered impersonators of each other if they are <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>.</p><p><div class="SIntrapara">If at least one of <span class="RktVar">v1</span> or <span class="RktVar">v2</span> is an impersonator:
|
|
</div><div class="SIntrapara"><ul><li><p>If <span class="RktVar">v1</span> impersonates <span class="RktVar">v1*</span> then <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1</span><span class="stt"> </span><span class="RktVar">v2</span><span class="RktPn">)</span>
|
|
is <span class="RktVal">#t</span> if and only if <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1*</span><span class="stt"> </span><span class="RktVar">v2</span><span class="RktPn">)</span> is <span class="RktVal">#t</span>.</p></li><li><p>If <span class="RktVar">v2</span> is a non-interposing impersonator that impersonates <span class="RktVar">v2*</span>, i.e.,
|
|
all of its interposition procedures are <span class="RktVal">#f</span>, then <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1</span><span class="stt"> </span><span class="RktVar">v2</span><span class="RktPn">)</span>
|
|
is <span class="RktVal">#t</span> if and only if <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1</span><span class="stt"> </span><span class="RktVar">v2*</span><span class="RktPn">)</span> is <span class="RktVal">#t</span>.</p></li><li><p>When <span class="RktVar">v2</span> is an impersonator constructed with at least one non-<span class="RktVal">#f</span> interposition procedure,
|
|
but <span class="RktVar">v1</span> is not an impersonator then <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1</span><span class="stt"> </span><span class="RktVar">v2</span><span class="RktPn">)</span> is <span class="RktVal">#f</span>.</p></li></ul></div></p><p>Otherwise, if neither <span class="RktVar">v1</span> or <span class="RktVar">v2</span> is an impersonator, but either
|
|
of them contains an impersonator as a subpart (e.g., <span class="RktVar">v1</span> is a list with
|
|
an impersonator as one of its elements), then <span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="stt"> </span><span class="RktVar">v1</span><span class="stt"> </span><span class="RktVar">v2</span><span class="RktPn">)</span>
|
|
proceeds by comparing <span class="RktVar">v1</span> and <span class="RktVar">v2</span> recursively (as 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>), returning true if all subparts are <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span>.</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._sub1%29%29" class="RktValLink" data-pltdoc="x">sub1</a></span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">#f</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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="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></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></span><span class="hspace"> </span><span class="RktVal">#f</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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><p><span class="RktRes">#f</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></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="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</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="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></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="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</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="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._sub1%29%29" class="RktValLink" data-pltdoc="x">sub1</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="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="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></span><span class="hspace"> </span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._sub1%29%29" class="RktValLink" data-pltdoc="x">sub1</a></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></table></blockquote></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._((quote._~23~25kernel)._chaperone-of~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-of~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-of?</a></span></span><span class="hspace"> </span><span class="RktVar">v1</span><span class="hspace"> </span><span class="RktVar">v2</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">v1</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">v2</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">Indicates whether <span class="RktVar">v1</span> can be considered equivalent modulo
|
|
chaperones to <span class="RktVar">v2</span>.</div></p><p>For values that include no chaperones or other impersonators,
|
|
<span class="RktVar">v1</span> and <span class="RktVar">v2</span> can be considered chaperones of each other
|
|
if they are <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-always~3f%29%29" class="RktValLink" data-pltdoc="x">equal-always?</a></span>, which requires that they are
|
|
<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> except that corresponding mutable
|
|
vectors, boxes, hash tables, strings, byte strings, <a href="mpairs.html#%28tech._mutable._pair%29" class="techoutside" data-pltdoc="x"><span class="techinside">mutable pairs</span></a>, and
|
|
mutable structures within
|
|
<span class="RktVar">v1</span> and <span class="RktVar">v2</span> must be <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>.</p><p>Otherwise, chaperones and other impersonators within <span class="RktVar">v2</span> must
|
|
be intact within <span class="RktVar">v1</span> analogous to way that
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span> requires that impersonators are preserved.
|
|
Furthermore, <span class="RktVar">v1</span> must not have any non-chaperone impersonators
|
|
whose corresponding value in <span class="RktVar">v2</span> is not the same impersonator.
|
|
Note that <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> implies <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span>,
|
|
but not vice-versa.</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._((quote._~23~25kernel)._impersonator-ephemeron))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-ephemeron%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-ephemeron</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="ephemerons.html#%28def._%28%28quote._~23~25kernel%29._ephemeron~3f%29%29" class="RktValLink" data-pltdoc="x">ephemeron?</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">Produces an <a href="ephemerons.html#%28tech._ephemeron%29" class="techoutside" data-pltdoc="x"><span class="techinside">ephemeron</span></a> that can be used to connect the
|
|
reachability of <span class="RktVar">v</span> (in the sense of garbage collection; see
|
|
<a href="eval-model.html#%28part._gc-model%29" data-pltdoc="x">Garbage Collection</a>) with the reachability of any value for which
|
|
<span class="RktVar">v</span> is an <a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a>. That is, the value <span class="RktVar">v</span>
|
|
will be considered reachable as long as the result ephemeron is
|
|
reachable in addition to any value that <span class="RktVar">v</span> impersonates
|
|
(including itself).</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._((quote._~23~25kernel)._procedure-impersonator*~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._procedure-impersonator%2A~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">procedure-impersonator*?</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">Returns <span class="RktVal">#t</span> for any procedure impersonator that either was produced by
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure*</a></span> or <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">chaperone-procedure*</a></span>, or is
|
|
an impersonator/chaperone of a value that was created with
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure*</a></span> or <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">chaperone-procedure*</a></span>
|
|
(possibly transitively).</div></p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Impersonator_Constructors"">14.5.1<tt> </tt><a name="(part._.Impersonator_.Constructors)"></a>Impersonator Constructors</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._impersonate-procedure))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-procedure</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</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">wrapper-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">wrapper-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator procedure that has the same arity, name, and
|
|
other attributes as <span class="RktVar">proc</span>. When the impersonator procedure is
|
|
applied, the arguments are first passed to <span class="RktVar">wrapper-proc</span>
|
|
(when it is not <span class="RktVal">#f</span>), and
|
|
then the results from <span class="RktVar">wrapper-proc</span> are passed to
|
|
<span class="RktVar">proc</span>. The <span class="RktVar">wrapper-proc</span> can also supply a procedure
|
|
that processes the results of <span class="RktVar">proc</span>.</div></p><p>The arity of <span class="RktVar">wrapper-proc</span> must include the arity of
|
|
<span class="RktVar">proc</span>. The allowed keyword arguments of <span class="RktVar">wrapper-proc</span>
|
|
must be a superset of the allowed keywords of <span class="RktVar">proc</span>. The
|
|
required keyword arguments of <span class="RktVar">wrapper-proc</span> must be a subset
|
|
of the required keywords of <span class="RktVar">proc</span>.</p><p>For applications without keywords, the result of <span class="RktVar">wrapper-proc</span>
|
|
must be at least the same number of values as supplied to it.
|
|
Additional results can be supplied—<wbr></wbr>before the values that correspond
|
|
to the supplied values—<wbr></wbr>in the following pattern:</p><ul><li><p>An optional procedure, <span class="RktVar">result-wrapper-proc</span>, which
|
|
will be applied to the results of <span class="RktVar">proc</span>; followed by</p></li><li><p>any number of repetitions of <span class="RktVal">'</span><span class="RktVal">mark</span><span class="stt"> </span><span class="RktVar">key</span><span class="stt"> </span><span class="RktVar">val</span> (i.e.,
|
|
three values), where the call <span class="RktVar">proc</span> is wrapped to
|
|
install a <a href="eval-model.html#%28tech._continuation._mark%29" class="techoutside" data-pltdoc="x"><span class="techinside">continuation mark</span></a> <span class="RktVar">key</span> and <span class="RktVar">val</span>.</p></li></ul><p>If <span class="RktVar">result-wrapper-proc</span> is produced, it must be a procedure
|
|
that accepts as many results as produced by <span class="RktVar">proc</span>; it must
|
|
return the same number of results. If <span class="RktVar">result-wrapper-proc</span> is
|
|
not supplied, then <span class="RktVar">proc</span> is called in <a href="eval-model.html#%28tech._tail._position%29" class="techoutside" data-pltdoc="x"><span class="techinside">tail position</span></a>
|
|
with respect to the call to the impersonator.</p><p>For applications that include keyword arguments, <span class="RktVar">wrapper-proc</span>
|
|
must return an additional value before any other values but after
|
|
<span class="RktVar">result-wrapper-proc</span> and <span class="RktVal">'</span><span class="RktVal">mark</span><span class="stt"> </span><span class="RktVar">key</span><span class="stt"> </span><span class="RktVar">val</span>
|
|
sequences (if any). The additional value must be a
|
|
list of replacements for the keyword arguments that were supplied to the
|
|
impersonator (i.e., not counting optional arguments that were
|
|
not supplied). The arguments must be ordered according to the sorted
|
|
order of the supplied arguments’ keywords.</p><p>If <span class="RktVar">wrapper-proc</span> is <span class="RktVal">#f</span>, then applying the resulting
|
|
impersonator is the same as applying <span class="RktVar">proc</span>. If
|
|
<span class="RktVar">wrapper-proc</span> is <span class="RktVal">#f</span> and no <span class="RktVar">prop</span> is provided, then
|
|
<span class="RktVar">proc</span> is returned and is not impersonated.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span> must be even) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">proc</span>.</p><p>If any <span class="RktVar">prop</span> is <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-prop~3aapplication-mark%29%29" class="RktValLink" data-pltdoc="x">impersonator-prop:application-mark</a></span> and if the
|
|
associated <span class="RktVar">prop-val</span> is a pair, then the call to <span class="RktVar">proc</span>
|
|
is wrapped with <span class="RktSym"><a href="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span> using <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="stt"> </span><span class="RktVar">prop-val</span><span class="RktPn">)</span> as the mark key and <span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._cdr%29%29" class="RktValLink" data-pltdoc="x">cdr</a></span><span class="stt"> </span><span class="RktVar">prop-val</span><span class="RktPn">)</span> as the mark
|
|
value. In addition, if the immediate
|
|
continuation frame of the call to the impersonated procedure
|
|
includes a value for <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="stt"> </span><span class="RktVar">prop-val</span><span class="RktPn">)</span>—<wbr></wbr>that is, if
|
|
<span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._call-with-immediate-continuation-mark%29%29" class="RktValLink" data-pltdoc="x">call-with-immediate-continuation-mark</a></span> would produce a value
|
|
for <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="stt"> </span><span class="RktVar">prop-val</span><span class="RktPn">)</span> in the call’s continuation—<wbr></wbr>then the value is
|
|
also installed as an immediate value for <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="stt"> </span><span class="RktVar">prop-val</span><span class="RktPn">)</span> as a
|
|
mark during the call to <span class="RktVar">wrapper-proc</span> (which allows tail-calls
|
|
of impersonators with respect to wrapping impersonators to be detected within
|
|
<span class="RktVar">wrapper-proc</span>).</p><p class="SHistory">Changed in version 6.3.0.5 of package <span class="stt">base</span>: Added support for <span class="RktVal">'</span><span class="RktVal">mark</span><span class="stt"> </span><span class="RktVar">key</span><span class="stt"> </span><span class="RktVar">val</span> results from
|
|
<span class="RktVar">wrapper-proc</span>.</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="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">add15</span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="hspace"> </span><span class="RktVal">15</span><span class="RktPn">)</span><span class="RktPn">)</span></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="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">add15+print</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym">add15</span></td></tr><tr><td><span class="hspace"> </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></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._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"called with ~s\n"</span><span class="hspace"> </span><span class="RktSym">x</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="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</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">res</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._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"returned ~s\n"</span><span class="hspace"> </span><span class="RktSym">res</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">res</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</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="RktSym">add15</span><span class="hspace"> </span><span class="RktVal">27</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">42</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">add15+print</span><span class="hspace"> </span><span class="RktVal">27</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktOut">called with 27</span></p></td></tr><tr><td><p><span class="RktOut">returned 42</span></p></td></tr></table></td></tr><tr><td><p><span class="RktRes">42</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="define.html#%28form._%28%28quote._~23~25kernel%29._define-values%29%29" class="RktStxLink" data-pltdoc="x">define-values</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p1</span><span class="hspace"> </span><span class="RktSym">imp-prop:p1?</span><span class="hspace"> </span><span class="RktSym">imp-prop:p1-get</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._make-impersonator-property%29%29" class="RktValLink" data-pltdoc="x">make-impersonator-property</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">imp-prop:p1</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="define.html#%28form._%28%28quote._~23~25kernel%29._define-values%29%29" class="RktStxLink" data-pltdoc="x">define-values</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p2</span><span class="hspace"> </span><span class="RktSym">imp-prop:p2?</span><span class="hspace"> </span><span class="RktSym">imp-prop:p2-get</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._make-impersonator-property%29%29" class="RktValLink" data-pltdoc="x">make-impersonator-property</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">imp-prop:p2</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="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">add15.2</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym">add15</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="hspace"> </span><span class="RktSym">imp-prop:p1</span><span class="hspace"> </span><span class="RktVal">11</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">add15.2</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">17</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p1?</span><span class="hspace"> </span><span class="RktSym">add15.2</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">imp-prop:p1-get</span><span class="hspace"> </span><span class="RktSym">add15.2</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">11</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p2?</span><span class="hspace"> </span><span class="RktSym">add15.2</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="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">add15.3</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym">add15.2</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="hspace"> </span><span class="RktSym">imp-prop:p2</span><span class="hspace"> </span><span class="RktVal">13</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">add15.3</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">18</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p1?</span><span class="hspace"> </span><span class="RktSym">add15.3</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">imp-prop:p1-get</span><span class="hspace"> </span><span class="RktSym">add15.3</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">11</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p2?</span><span class="hspace"> </span><span class="RktSym">add15.3</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">imp-prop:p2-get</span><span class="hspace"> </span><span class="RktSym">add15.3</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">13</span></p></td></tr><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">add15.4</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span><span class="hspace"> </span><span class="RktSym">add15.3</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="hspace"> </span><span class="RktSym">imp-prop:p1</span><span class="hspace"> </span><span class="RktVal">101</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">add15.4</span><span class="hspace"> </span><span class="RktVal">4</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">19</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p1?</span><span class="hspace"> </span><span class="RktSym">add15.4</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">imp-prop:p1-get</span><span class="hspace"> </span><span class="RktSym">add15.4</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">101</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">imp-prop:p2?</span><span class="hspace"> </span><span class="RktSym">add15.4</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">imp-prop:p2-get</span><span class="hspace"> </span><span class="RktSym">add15.4</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">13</span></p></td></tr></table></blockquote></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/private/base..rkt)._impersonate-procedure*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-procedure*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</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">wrapper-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">wrapper-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span>, except that <span class="RktVar">wrapper-proc</span>
|
|
receives an additional argument before all other arguments. The
|
|
additional argument is the procedure <span class="RktVar">orig-proc</span> that was
|
|
originally applied.</div></p><p>If the result of <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure*</a></span> is applied directly,
|
|
then <span class="RktVar">orig-proc</span> is that result. If the result is further
|
|
impersonated before being applied, however, <span class="RktVar">orig-proc</span> is the
|
|
further impersonator.</p><p>An <span class="RktVar">orig-proc</span> argument might be useful so that
|
|
<span class="RktVar">wrapper-proc</span> can extract <a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator properties</span></a>
|
|
that are overridden by further impersonators, for example.</p><p class="SHistory">Added in version 6.1.1.5 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>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._impersonate-struct))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-struct</a></span></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"> </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="RktVar">struct-type</span><span class="RktOpt">]</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">orig-proc</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">redirect-proc</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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></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><tr><td><span class="hspace"> </span><span class="RktVar">struct-type</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-type~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type?</a></span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVar">unspecified</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">orig-proc</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"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><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="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-accessor-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-accessor-procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-mutator-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-mutator-procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property-accessor-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property-accessor-procedure?</a></span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">redirect-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">v</span>, which redirects certain
|
|
operations on the impersonated value. The <span class="RktVar">orig-proc</span>s
|
|
indicate the operations to redirect, and the corresponding
|
|
<span class="RktVar">redirect-proc</span>s supply the redirections. The optional
|
|
<span class="RktVar">struct-type</span> argument, when provided, acts as a witness for
|
|
the representation of <span class="RktVar">v</span>, which must be an instance of
|
|
<span class="RktVar">struct-type</span>.</div></p><p>The protocol for a <span class="RktVar">redirect-proc</span> depends on the corresponding
|
|
<span class="RktVar">orig-proc</span>, where <span class="RktVar">self</span> refers to the value to which
|
|
<span class="RktVar">orig-proc</span> is originally applied:</p><ul><li><p>A structure-field accessor: <span class="RktVar">redirect-proc</span>
|
|
must accept two arguments, <span class="RktVar">self</span> and the value
|
|
<span class="RktVar">field-v</span> that <span class="RktVar">orig-proc</span> produces for
|
|
<span class="RktVar">v</span>; it must return a replacement for
|
|
<span class="RktVar">field-v</span>. The corresponding field must not be
|
|
immutable, and either the field’s structure type must be
|
|
accessible via the current <a href="inspectors.html#%28tech._inspector%29" class="techoutside" data-pltdoc="x"><span class="techinside">inspector</span></a> or one of the other
|
|
<span class="RktVar">orig-proc</span>s must be a structure-field mutator for the
|
|
same field.</p></li><li><p>A structure-field mutator: <span class="RktVar">redirect-proc</span> must accept
|
|
two arguments, <span class="RktVar">self</span> and the value <span class="RktVar">field-v</span>
|
|
supplied to the mutator; it must return a replacement for
|
|
<span class="RktVar">field-v</span> to be propagated to <span class="RktVar">orig-proc</span> and
|
|
<span class="RktVar">v</span>.</p></li><li><p>A property accessor: <span class="RktVar">redirect-proc</span> uses the same
|
|
protocol as for a structure-field accessor. The accessor’s
|
|
property must have been created with <span class="RktVal">'</span><span class="RktVal">can-impersonate</span>
|
|
as the second argument to <span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._make-struct-type-property%29%29" class="RktValLink" data-pltdoc="x">make-struct-type-property</a></span>.</p></li></ul><p>When a <span class="RktVar">redirect-proc</span> is <span class="RktVal">#f</span>, the corresponding
|
|
<span class="RktVar">orig-proc</span> is unaffected. Supplying <span class="RktVal">#f</span> for a
|
|
<span class="RktVar">redirect-proc</span> is useful to allow its <span class="RktVar">orig-proc</span> to
|
|
act as a “witness” of <span class="RktVar">v</span>’s representation and enable the
|
|
addition of <span class="RktVar">prop</span>s.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="RktValLink" data-pltdoc="x">impersonate-struct</a></span> must be even if <span class="RktVar">struct-type</span>
|
|
is provided, odd otherwise) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">v</span>.</p><p>Each <span class="RktVar">orig-proc</span> must indicate a distinct operation. If no
|
|
<span class="RktVar">struct-type</span> and no <span class="RktVar">orig-proc</span>s are supplied, then no <span class="RktVar">prop</span>s must be
|
|
supplied. If <span class="RktVar">orig-proc</span>s are supplied only with <span class="RktVal">#f</span>
|
|
<span class="RktVar">redirect-proc</span>s and no <span class="RktVar">prop</span>s are supplied, then
|
|
<span class="RktVar">v</span> is returned and is not impersonated.</p><p>If any <span class="RktVar">orig-proc</span> is itself an impersonator, then a use of the
|
|
accessor or mutator that <span class="RktVar">orig-proc</span> impersonates is redirected
|
|
for the resulting impersonated structure to use <span class="RktVar">orig-proc</span> on
|
|
<span class="RktVar">v</span> before <span class="RktVar">redirect-proc</span> (in the case of accessor) or
|
|
after <span class="RktVar">redirect-proc</span> (in the case of a mutator).</p><p class="SHistory">Changed in version 6.1.1.2 of package <span class="stt">base</span>: Changed first argument to an
|
|
accessor or mutator
|
|
<span class="RktVar">redirect-proc</span> from
|
|
<span class="RktVar">v</span> to <span class="RktVar">self</span>.<br/>Changed in version 6.1.1.8: Added optional <span class="RktVar">struct-type</span>
|
|
argument.</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._((quote._~23~25kernel)._impersonate-vector))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-vector</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">vec</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">ref-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vec</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 class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</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="booleans.html#%28def._%28%28quote._~23~25kernel%29._immutable~3f%29%29" class="RktValLink" data-pltdoc="x">immutable?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">ref-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">vec</span>, which redirects the
|
|
<span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span> and <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-set%21%29%29" class="RktValLink" data-pltdoc="x">vector-set!</a></span> operations.</div></p><p>The <span class="RktVar">ref-proc</span> and <span class="RktVar">set-proc</span> arguments must either both be procedures
|
|
or both be <span class="RktVal">#f</span>. If they are <span class="RktVal">#f</span> then <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="RktValLink" data-pltdoc="x">impersonate-vector</a></span> does not interpose
|
|
on <span class="RktVar">vec</span>, but still allows attaching impersonator properties.</p><p>If <span class="RktVar">ref-proc</span> is a procedure it must accept <span class="RktVar">vec</span>, an index passed to
|
|
<span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span>, and the value that <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span> on
|
|
<span class="RktVar">vec</span> produces for the given index; it must produce a
|
|
replacement for the value, which is the result of <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-ref%29%29" class="RktValLink" data-pltdoc="x">vector-ref</a></span>
|
|
on the impersonator.</p><p>If <span class="RktVar">set-proc</span> is a procedure it must accept <span class="RktVar">vec</span>, an index passed to
|
|
<span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-set%21%29%29" class="RktValLink" data-pltdoc="x">vector-set!</a></span>, and the value passed to <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-set%21%29%29" class="RktValLink" data-pltdoc="x">vector-set!</a></span>; it
|
|
must produce a replacement for the value, which is used
|
|
with <span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector-set%21%29%29" class="RktValLink" data-pltdoc="x">vector-set!</a></span> on the original <span class="RktVar">vec</span> to install the
|
|
value.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="RktValLink" data-pltdoc="x">impersonate-vector</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">vec</span>.</p><p class="SHistory">Changed in version 6.9.0.2 of package <span class="stt">base</span>: Added non-interposing vector impersonators.</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._((quote._~23~25kernel)._impersonate-vector*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-vector*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">vec</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">ref-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vec</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 class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</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="booleans.html#%28def._%28%28quote._~23~25kernel%29._immutable~3f%29%29" class="RktValLink" data-pltdoc="x">immutable?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">ref-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="RktValLink" data-pltdoc="x">impersonate-vector</a></span>, except that <span class="RktVar">ref-proc</span> and <span class="RktVar">set-proc</span> each receive
|
|
an additional vector as argument before other arguments. The additional argument is the original
|
|
impersonated vector, access to which triggered interposition in the first place.</div></p><p>The additional vector argument might be useful so that <span class="RktVar">ref-proc</span> or <span class="RktVar">set-proc</span>
|
|
can extract impersonator properties that are overridden by further impersonators, for example.</p><p class="SHistory">Added in version 6.9.0.2 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>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._impersonate-box))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-box%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-box</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">box</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">unbox-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">box</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 class="hspace"> </span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</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="booleans.html#%28def._%28%28quote._~23~25kernel%29._immutable~3f%29%29" class="RktValLink" data-pltdoc="x">immutable?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">unbox-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">box</span>, which redirects the
|
|
<span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._unbox%29%29" class="RktValLink" data-pltdoc="x">unbox</a></span> and <span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._set-box%21%29%29" class="RktValLink" data-pltdoc="x">set-box!</a></span> operations.</div></p><p>The <span class="RktVar">unbox-proc</span> must accept <span class="RktVar">box</span> and the value that
|
|
<span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._unbox%29%29" class="RktValLink" data-pltdoc="x">unbox</a></span> produces on <span class="RktVar">box</span>; it must produce a replacement
|
|
value, which is the result of <span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._unbox%29%29" class="RktValLink" data-pltdoc="x">unbox</a></span> on the impersonator.</p><p>The <span class="RktVar">set-proc</span> must accept <span class="RktVar">box</span> and the value passed to
|
|
<span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._set-box%21%29%29" class="RktValLink" data-pltdoc="x">set-box!</a></span>; it must produce a replacement
|
|
value, which is used with <span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._set-box%21%29%29" class="RktValLink" data-pltdoc="x">set-box!</a></span> on the original
|
|
<span class="RktVar">box</span> to install the value.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-box%29%29" class="RktValLink" data-pltdoc="x">impersonate-box</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">box</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._impersonate-hash))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-hash%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-hash</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">hash</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">ref-proc</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">set-proc</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">remove-proc</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">key-proc</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="RktVar">clear-proc</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">equal-key-proc</span><span class="RktOpt">]</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">hash</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 class="hspace"> </span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="booleans.html#%28def._%28%28quote._~23~25kernel%29._immutable~3f%29%29" class="RktValLink" data-pltdoc="x">immutable?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">ref-proc</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"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span></td></tr><tr><td><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="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="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="RktPn"> .</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</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="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><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">remove-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">key-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">clear-proc</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="RktVal">#f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">#f</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">equal-key-proc</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="RktVal">#f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">#f</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">hash</span>, which redirects the
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>, <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span> (as
|
|
applicable), <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%21%29%29" class="RktValLink" data-pltdoc="x">hash-remove!</a></span> (as
|
|
applicable), <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%29%29" class="RktValLink" data-pltdoc="x">hash-clear</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%21%29%29" class="RktValLink" data-pltdoc="x">hash-clear!</a></span> (as
|
|
applicable and if <span class="RktVar">clear-proc</span> is not <span class="RktVal">#f</span>) operations. When
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span>, <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%29%29" class="RktValLink" data-pltdoc="x">hash-clear</a></span> is used on an impersonator of a hash
|
|
table, the result is an impersonator with the same redirecting procedures.
|
|
In addition, operations like
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-key%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-key</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-map%29%29" class="RktValLink" data-pltdoc="x">hash-map</a></span>, which extract
|
|
keys from the table, use <span class="RktVar">key-proc</span> to replace keys extracted
|
|
from the table. Operations like <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-value%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-value</a></span> or
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._hash-values%29%29" class="RktValLink" data-pltdoc="x">hash-values</a></span> implicitly use <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span> and
|
|
therefore redirect through <span class="RktVar">ref-proc</span>. The <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref-key%29%29" class="RktValLink" data-pltdoc="x">hash-ref-key</a></span>
|
|
operation uses both <span class="RktVar">ref-proc</span> and <span class="RktVar">key-proc</span>, the
|
|
former to lookup the requested key and the latter to extract it.</div></p><p>The <span class="RktVar">ref-proc</span> must accept <span class="RktVar">hash</span> and a key passed
|
|
to <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>. It must return a replacement key
|
|
as well as a procedure. The returned procedure is called only if the
|
|
returned key is found in <span class="RktVar">hash</span> via <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>, in which
|
|
case the procedure is called with <span class="RktVar">hash</span>, the previously
|
|
returned key, and the found value. The returned procedure must itself
|
|
return a replacement for the found value. The returned procedure
|
|
is ignored by <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref-key%29%29" class="RktValLink" data-pltdoc="x">hash-ref-key</a></span>.</p><p>The <span class="RktVar">set-proc</span> must accept <span class="RktVar">hash</span>, a key passed to
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span>, and the value passed to
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span>; it must produce two values: a
|
|
replacement for the key and a replacement for the value. The returned
|
|
key and value are used with <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span> on
|
|
the original <span class="RktVar">hash</span> to install the value.</p><p>The <span class="RktVar">remove-proc</span> must accept <span class="RktVar">hash</span> and a key passed to
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%21%29%29" class="RktValLink" data-pltdoc="x">hash-remove!</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span>; it must produce a
|
|
replacement for the key, which is used with <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%21%29%29" class="RktValLink" data-pltdoc="x">hash-remove!</a></span> or
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span> on the original <span class="RktVar">hash</span> to remove any
|
|
mapping using the (impersonator-replaced) key.</p><p>The <span class="RktVar">key-proc</span> must accept <span class="RktVar">hash</span> and a key that has
|
|
been extracted from <span class="RktVar">hash</span> (by <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref-key%29%29" class="RktValLink" data-pltdoc="x">hash-ref-key</a></span>,
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-key%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-key</a></span>, or other operations that use
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-key%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-key</a></span> internally); it must produce a replacement
|
|
for the key, which is then reported as a key extracted from the table.</p><p>If <span class="RktVar">clear-proc</span> is not <span class="RktVal">#f</span>, it must accept
|
|
<span class="RktVar">hash</span> as an argument, and its result is ignored. The fact that
|
|
<span class="RktVar">clear-proc</span> returns (as opposed to raising an exception or
|
|
otherwise escaping) grants the capability to remove all keys from <span class="RktVar">hash</span>.
|
|
If <span class="RktVar">clear-proc</span> is <span class="RktVal">#f</span>, then <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%29%29" class="RktValLink" data-pltdoc="x">hash-clear</a></span> or
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%21%29%29" class="RktValLink" data-pltdoc="x">hash-clear!</a></span> on the impersonator is implemented using
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-key%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-key</a></span> and <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span> or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%21%29%29" class="RktValLink" data-pltdoc="x">hash-remove!</a></span>.</p><p>If <span class="RktVar">equal-key-proc</span> is not <span class="RktVal">#f</span>, it effectively
|
|
interposes on calls to <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>, <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-hash-code</a></span>, and
|
|
<span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-secondary-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-secondary-hash-code</a></span> for the keys of <span class="RktVar">hash</span>. The
|
|
<span class="RktVar">equal-key-proc</span> must accept as its arguments <span class="RktVar">hash</span> and
|
|
a key that is either mapped by <span class="RktVar">hash</span> or passed to
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>, etc., where the latter has potentially been
|
|
adjusted by the corresponding <span class="RktVar">ref-proc</span>, etc<span class="Sendsentence">.</span> The result
|
|
is a value that is passed to <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>,
|
|
<span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-hash-code</a></span>, and <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-secondary-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-secondary-hash-code</a></span> as
|
|
needed to hash and compare keys. In the case of <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%21%29%29" class="RktValLink" data-pltdoc="x">hash-set!</a></span> or
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span>, the key that is passed to <span class="RktVar">equal-key-proc</span>
|
|
is the one stored in the hash table for future lookup.</p><p>The <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-value%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-value</a></span>, <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-map%29%29" class="RktValLink" data-pltdoc="x">hash-map</a></span>, or
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-for-each%29%29" class="RktValLink" data-pltdoc="x">hash-for-each</a></span> functions use a combination of
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-iterate-key%29%29" class="RktValLink" data-pltdoc="x">hash-iterate-key</a></span> and <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>. If a key
|
|
produced by <span class="RktVar">key-proc</span> does not yield a value through
|
|
<span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-ref%29%29" class="RktValLink" data-pltdoc="x">hash-ref</a></span>, then the <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> exception is raised.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">hash</span>.</p><p>In the case of an immutable hash table, two impersonated hash tables count as
|
|
“the same value” (for purposes of <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span>) when their
|
|
redirection procedures were originally attached to a hash table by the same
|
|
call to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-hash%29%29" class="RktValLink" data-pltdoc="x">impersonate-hash</a></span> or <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-hash%29%29" class="RktValLink" data-pltdoc="x">chaperone-hash</a></span> (and potentially
|
|
propagated by <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-set%29%29" class="RktValLink" data-pltdoc="x">hash-set</a></span>, <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-remove%29%29" class="RktValLink" data-pltdoc="x">hash-remove</a></span>, or <span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash-clear%29%29" class="RktValLink" data-pltdoc="x">hash-clear</a></span>),
|
|
as long as the content of the first hash table is <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span> of
|
|
the second hash table.</p><p class="SHistory">Changed in version 6.3.0.11 of package <span class="stt">base</span>: Added the <span class="RktVar">equal-key-proc</span>
|
|
argument.</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._((quote._~23~25kernel)._impersonate-channel))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-channel%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-channel</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">channel</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">get-proc</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">put-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">channel</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">get-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span><span class="hspace"> </span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/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="RktPn"> .</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">put-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">channel</span>, which redirects the
|
|
<span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-get%29%29" class="RktValLink" data-pltdoc="x">channel-get</a></span> and <span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-put%29%29" class="RktValLink" data-pltdoc="x">channel-put</a></span> operations.</div></p><p>The <span class="RktVar">get-proc</span> generator is called on <span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-get%29%29" class="RktValLink" data-pltdoc="x">channel-get</a></span>
|
|
or any other operation that fetches results from the channel (such
|
|
as a <span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._sync%29%29" class="RktValLink" data-pltdoc="x">sync</a></span> on the channel). The <span class="RktVar">get-proc</span> must return
|
|
two values: a <a href="channel.html#%28tech._channel%29" class="techoutside" data-pltdoc="x"><span class="techinside">channel</span></a> that is an impersonator of <span class="RktVar">channel</span>, and a
|
|
procedure that is used to check the channel’s contents.</p><p>The <span class="RktVar">put-proc</span> must accept <span class="RktVar">channel</span> and the value passed to
|
|
<span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-put%29%29" class="RktValLink" data-pltdoc="x">channel-put</a></span>; it must produce a replacement
|
|
value, which is used with <span class="RktSym"><a href="channel.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._channel-put%29%29" class="RktValLink" data-pltdoc="x">channel-put</a></span> on the original
|
|
<span class="RktVar">channel</span> to send the value over the channel.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-channel%29%29" class="RktValLink" data-pltdoc="x">impersonate-channel</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">channel</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._impersonate-prompt-tag))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-prompt-tag%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-prompt-tag</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">prompt-tag</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">handle-proc</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">abort-proc</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="RktVar">cc-guard-proc</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">callcc-impersonate-proc</span><span class="RktOpt">]</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="cont.html#%28def._%28%28quote._~23~25kernel%29._continuation-prompt-tag~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-prompt-tag?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prompt-tag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._continuation-prompt-tag~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-prompt-tag?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">abort-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">cc-guard-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">callcc-impersonate-proc</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="RktPn">(</span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="RktPn">)</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="hspace"> </span></td><td valign="top">=</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">p</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">p</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">prompt-tag</span>, which redirects
|
|
the <span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span> and
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span> operations.</div></p><p>The <span class="RktVar">handle-proc</span> must accept the values that the handler
|
|
of a continuation prompt would take and it must produce replacement
|
|
values, which will be passed to the handler.</p><p>The <span class="RktVar">abort-proc</span> must accept the values passed to
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span>; it must produce replacement
|
|
values, which are aborted to the appropriate prompt.</p><p>The <span class="RktVar">cc-guard-proc</span> must accept the values produced by
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span> in the case that a
|
|
non-composable continuation is applied to replace the continuation
|
|
that is delimited by the prompt, but only if
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span> is not later used to abort the
|
|
continuation delimited by the prompt (in which case
|
|
<span class="RktVar">abort-proc</span> is used).</p><p>The <span class="RktVar">callcc-impersonate-proc</span> must accept a procedure that
|
|
guards the result of a continuation captured by
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-current-continuation%29%29" class="RktValLink" data-pltdoc="x">call-with-current-continuation</a></span> with the impersonated prompt
|
|
tag. The <span class="RktVar">callcc-impersonate-proc</span> is applied (under a
|
|
<a href="eval-model.html#%28tech._continuation._barrier%29" class="techoutside" data-pltdoc="x"><span class="techinside">continuation barrier</span></a>) when the captured continuation is applied
|
|
to refine a guard function (initially <span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span>) that is
|
|
specific to the delimiting prompt; this prompt-specific guard is
|
|
ultimately composed with any <span class="RktVar">cc-guard-proc</span> that is in effect
|
|
at the delimiting prompt, and it is not used in the same case that a
|
|
<span class="RktVar">cc-guard-proc</span> is not used (i.e., when
|
|
<span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span> is used to abort to the
|
|
prompt). In the special case where the delimiting prompt at
|
|
application time is a thread’s built-in initial prompt,
|
|
<span class="RktVar">callcc-impersonate-proc</span> is ignored (partly on the grounds
|
|
that the initial prompt’s result is ignored).</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">impersonate-prompt-tag</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">prompt-tag</span>.</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"><a href="creatingunits.html#%28form._%28%28lib._racket%2Funit..rkt%29._tag%29%29" class="RktStxLink" data-pltdoc="x">tag</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">impersonate-prompt-tag</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">make-continuation-prompt-tag</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2A%29%29" class="RktValLink" data-pltdoc="x">*</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktVal">2</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </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="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span><span class="hspace"> </span><span class="RktSym"><a href="creatingunits.html#%28form._%28%28lib._racket%2Funit..rkt%29._tag%29%29" class="RktStxLink" data-pltdoc="x">tag</a></span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym"><a href="creatingunits.html#%28form._%28%28lib._racket%2Funit..rkt%29._tag%29%29" class="RktStxLink" data-pltdoc="x">tag</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">12</span></p></td></tr></table></blockquote></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._((quote._~23~25kernel)._impersonate-continuation-mark-key))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-continuation-mark-key%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonate-continuation-mark-key</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">key</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">get-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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">continuation-mark?</span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">key</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-key~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-key?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">get-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns an impersonator of <span class="RktVar">key</span>, which redirects
|
|
<span class="RktSym"><a href="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span> and continuation mark accessors such
|
|
as <span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-set-~3elist%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-set->list</a></span>.</div></p><p>The <span class="RktVar">get-proc</span> must accept the value attached to a
|
|
continuation mark and it must produce a replacement
|
|
value, which will be returned by the continuation mark accessor.</p><p>The <span class="RktVar">set-proc</span> must accept a value passed to
|
|
<span class="RktSym"><a href="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span>; it must produce a replacement
|
|
value, which is attached to the continuation frame.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">impersonate-continuation-mark-key</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">key</span>.</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">mark-key</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">impersonate-continuation-mark-key</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">make-continuation-mark-key</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">l</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29" class="RktValLink" data-pltdoc="x">map</a></span><span class="hspace"> </span><span class="RktSym"><a href="characters.html#%28def._%28%28quote._~23~25kernel%29._char-upcase%29%29" class="RktValLink" data-pltdoc="x">char-upcase</a></span><span class="hspace"> </span><span class="RktSym">l</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">s</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string-~3elist%29%29" class="RktValLink" data-pltdoc="x">string->list</a></span><span class="hspace"> </span><span class="RktSym">s</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span><span class="hspace"> </span><span class="RktSym">mark-key</span><span class="hspace"> </span><span class="RktVal">"quiche"</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-set-first%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-set-first</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._current-continuation-marks%29%29" class="RktValLink" data-pltdoc="x">current-continuation-marks</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">mark-key</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">'(#\Q #\U #\I #\C #\H #\E)</span></p></td></tr></table></blockquote></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>value</p></div></div><p class="RForeground"><a name="(def._((quote._~23~25kernel)._prop~3aimpersonator-of))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:impersonator-of</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></blockquote></div><div class="SIntrapara">A <a href="structprops.html#%28tech._structure._type._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">structure type property</span></a> (see <a href="structprops.html" data-pltdoc="x">Structure Type Properties</a>) that
|
|
supplies a procedure for extracting an impersonated value from a structure
|
|
that represents an impersonator. The property is used for <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span>
|
|
as well as <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>.</div></p><p>The property value must be a procedure of one argument, which is a
|
|
structure whose structure type has the property. The result can be
|
|
<span class="RktVal">#f</span> to indicate the structure does not represent an impersonator,
|
|
otherwise the result is a value for which the original structure is an
|
|
impersonator (so the original structure is an <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span> and
|
|
<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 the result value). The result value must have the
|
|
same <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValLink" data-pltdoc="x">prop:impersonator-of</a></span> and <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._prop~3aequal%2Bhash%29%29" class="RktValLink" data-pltdoc="x">prop:equal+hash</a></span> property
|
|
values as the original structure, if any, and the property values must be
|
|
inherited from the same structure type (which ensures some consistency
|
|
between <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-of~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator-of?</a></span> and <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>).</p><p><a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">Impersonator property</span></a> predicates and accessors applied to a
|
|
structure with the <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValLink" data-pltdoc="x">prop:impersonator-of</a></span> property first check
|
|
for the property on the immediate structure, and if it is not found,
|
|
the value produced by the <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValLink" data-pltdoc="x">prop:impersonator-of</a></span> procedure is
|
|
checked (recursively).</p><p class="SHistory">Changed in version 6.1.1.8 of package <span class="stt">base</span>: Made <a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator property</span></a>
|
|
predicates and accessors sensitive
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aimpersonator-of%29%29" class="RktValLink" data-pltdoc="x">prop:impersonator-of</a></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>value</p></div></div><p class="RForeground"><a name="(def._((quote._~23~25kernel)._prop~3aauthentic))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._prop~3aauthentic%29%29" class="RktValDef RktValLink" data-pltdoc="x">prop:authentic</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></blockquote></div><div class="SIntrapara">A <a href="structprops.html#%28tech._structure._type._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">structure type property</span></a> that declares a structure type as
|
|
<a name="(tech._authentic)"></a><span style="font-style: italic">authentic</span>. The value associated with the property is ignored;
|
|
the presence of the property itself makes the structure type
|
|
authentic.</div></p><p>Instances of an <a href="chaperones.html#%28tech._authentic%29" class="techoutside" data-pltdoc="x"><span class="techinside">authentic</span></a> structure type cannot be impersonated
|
|
via <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="RktValLink" data-pltdoc="x">impersonate-struct</a></span> or chaperoned via
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct%29%29" class="RktValLink" data-pltdoc="x">chaperone-struct</a></span>. As a consequence, an instance of an
|
|
<a href="chaperones.html#%28tech._authentic%29" class="techoutside" data-pltdoc="x"><span class="techinside">authentic</span></a> structure type can be given a contract (see
|
|
<span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fstruct-dc..rkt%29._struct%2Fc%29%29" class="RktStxLink" data-pltdoc="x">struct/c</a></span>) only if it is a <a href="contracts.html#%28tech._flat._contract%29" class="techoutside" data-pltdoc="x"><span class="techinside">flat contract</span></a>.</p><p>Declaring a structure type as <a href="chaperones.html#%28tech._authentic%29" class="techoutside" data-pltdoc="x"><span class="techinside">authentic</span></a> can prevent unwanted
|
|
structure impersonation, but exposed structure types normally should
|
|
support impersonators or chaperones to facilitate contracts. Declaring
|
|
a structure type as <a href="chaperones.html#%28tech._authentic%29" class="techoutside" data-pltdoc="x"><span class="techinside">authentic</span></a> can also slightly improve the
|
|
performance of structure predicates, selectors, and mutators, which
|
|
can be appropriate for data structures that are private
|
|
and frequently used within a library.</p><p class="SHistory">Added in version 6.9.0.4 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=""Chaperone_Constructors"">14.5.2<tt> </tt><a name="(part._.Chaperone_.Constructors)"></a>Chaperone Constructors</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._chaperone-procedure))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-procedure</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</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">wrapper-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">wrapper-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span>, but for each value supplied to
|
|
<span class="RktVar">wrapper-proc</span>, the corresponding result must be the same or a
|
|
chaperone of (in the sense of <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>) the supplied
|
|
value. The additional result, if any, that precedes the chaperoned
|
|
values must be a procedure that accepts as many results as produced by
|
|
<span class="RktVar">proc</span>; it must return the same number of results, each of
|
|
which is the same or a chaperone of the corresponding original result.</div></p><p>For applications that include keyword arguments, <span class="RktVar">wrapper-proc</span>
|
|
must return an additional value before any other values but after the
|
|
result-chaperoning procedure (if any). The additional value must be a
|
|
list of chaperones of the keyword arguments that were supplied to the
|
|
chaperone procedure (i.e., not counting optional arguments that were
|
|
not supplied). The arguments must be ordered according to the sorted
|
|
order of the supplied arguments’ keywords.</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/private/base..rkt)._chaperone-procedure*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-procedure*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</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">wrapper-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">wrapper-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%29%29" class="RktValLink" data-pltdoc="x">chaperone-procedure</a></span>, but <span class="RktVar">wrapper-proc</span> receives
|
|
an extra argument as with <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%2A%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure*</a></span>.</div></p><p class="SHistory">Added in version 6.1.1.5 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>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._chaperone-struct))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-struct</a></span></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"> </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="RktVar">struct-type</span><span class="RktOpt">]</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">orig-proc</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">redirect-proc</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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></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><tr><td><span class="hspace"> </span><span class="RktVar">struct-type</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-type~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type?</a></span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVar">unspecified</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">orig-proc</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"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><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="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-accessor-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-accessor-procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-mutator-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-mutator-procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="structprops.html#%28def._%28%28quote._~23~25kernel%29._struct-type-property-accessor-procedure~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type-property-accessor-procedure?</a></span></td></tr><tr><td><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._one-of%2Fc%29%29" class="RktValLink" data-pltdoc="x">one-of/c</a></span><span class="hspace"> </span><span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-info%29%29" class="RktValLink" data-pltdoc="x">struct-info</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">redirect-proc</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="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-struct%29%29" class="RktValLink" data-pltdoc="x">impersonate-struct</a></span>, but with the following refinements,
|
|
where <span class="RktVar">self</span> refers to the value to which
|
|
a <span class="RktVar">orig-proc</span> is originally applied:</div></p><ul><li><p>With a structure-field accessor as <span class="RktVar">orig-proc</span>,
|
|
<span class="RktVar">redirect-proc</span> must accept two arguments, <span class="RktVar">self</span> and
|
|
the value <span class="RktVar">field-v</span> that <span class="RktVar">orig-proc</span> produces for
|
|
<span class="RktVar">v</span>; it must return a chaperone of <span class="RktVar">field-v</span>. The
|
|
corresponding field may be immutable.</p></li><li><p>With structure-field mutator as <span class="RktVar">orig-proc</span>,
|
|
<span class="RktVar">redirect-proc</span> must accept two arguments, <span class="RktVar">self</span> and
|
|
the value <span class="RktVar">field-v</span> supplied to the mutator; it must
|
|
return a chaperone of <span class="RktVar">field-v</span> to be propagated to
|
|
<span class="RktVar">orig-proc</span> and <span class="RktVar">v</span>.</p></li><li><p>A property accessor can be supplied as <span class="RktVar">orig-proc</span>, and
|
|
the property need not have been created with
|
|
<span class="RktVal">'</span><span class="RktVal">can-impersonate</span>. The corresponding
|
|
<span class="RktVar">redirect-proc</span> uses the same protocol as for a
|
|
structure-field accessor.</p></li><li><p>With <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-info%29%29" class="RktValLink" data-pltdoc="x">struct-info</a></span> as <span class="RktVar">orig-proc</span>, the
|
|
corresponding <span class="RktVar">redirect-proc</span> must accept two values,
|
|
which are the results of <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-info%29%29" class="RktValLink" data-pltdoc="x">struct-info</a></span> on <span class="RktVar">v</span>; it
|
|
must return each values or a chaperone of each value. The
|
|
<span class="RktVar">redirect-proc</span> is not called if <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-info%29%29" class="RktValLink" data-pltdoc="x">struct-info</a></span>
|
|
would return <span class="RktVal">#f</span> as its first argument. An
|
|
<span class="RktVar">orig-proc</span> can be <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-info%29%29" class="RktValLink" data-pltdoc="x">struct-info</a></span> only if
|
|
<span class="RktVar">struct-type</span> or some other <span class="RktVar">orig-proc</span> is supplied.</p></li><li><p>Any accessor or mutator <span class="RktVar">orig-proc</span> that is an
|
|
<a href="chaperones.html#%28tech._impersonator%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator</span></a> must be specifically a <a href="chaperones.html#%28tech._chaperone%29" class="techoutside" data-pltdoc="x"><span class="techinside">chaperone</span></a>.</p></li></ul><p>Supplying a property accessor for <span class="RktVar">orig-proc</span> enables
|
|
<span class="RktVar">prop</span> arguments, the same as supplying an accessor, mutator,
|
|
or structure type.</p><p class="SHistory">Changed in version 6.1.1.2 of package <span class="stt">base</span>: Changed first argument to an
|
|
accessor or mutator
|
|
<span class="RktVar">redirect-proc</span> from
|
|
<span class="RktVar">v</span> to <span class="RktVar">self</span>.<br/>Changed in version 6.1.1.8: Added optional <span class="RktVar">struct-type</span>
|
|
argument.</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._((quote._~23~25kernel)._chaperone-vector))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-vector%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-vector</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">vec</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">ref-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vec</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">ref-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%29%29" class="RktValLink" data-pltdoc="x">impersonate-vector</a></span>, but with support for immutable vectors. The
|
|
<span class="RktVar">ref-proc</span> procedure must produce the same value or a chaperone
|
|
of the original value, and <span class="RktVar">set-proc</span> must produce the value
|
|
that is given or a chaperone of the value. The <span class="RktVar">set-proc</span> will
|
|
not be used if <span class="RktVar">vec</span> is immutable.</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._((quote._~23~25kernel)._chaperone-vector*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-vector%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-vector*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">vec</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">ref-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">vec</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 class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</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="booleans.html#%28def._%28%28quote._~23~25kernel%29._immutable~3f%29%29" class="RktValLink" data-pltdoc="x">immutable?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">ref-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</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="RktPn">(</span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="vectors.html#%28def._%28%28quote._~23~25kernel%29._vector~3f%29%29" class="RktValLink" data-pltdoc="x">vector?</a></span><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-nonnegative-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-nonnegative-integer?</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="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="RktPn"> .</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><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-vector%29%29" class="RktValLink" data-pltdoc="x">chaperone-vector</a></span>, but <span class="RktVar">ref-proc</span> and <span class="RktVar">set-proc</span> receive an extra argument
|
|
as with <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-vector%2A%29%29" class="RktValLink" data-pltdoc="x">impersonate-vector*</a></span>.</div></p><p class="SHistory">Added in version 6.9.0.2 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>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._chaperone-box))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-box%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-box</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">box</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">unbox-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">box</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">unbox-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="boxes.html#%28def._%28%28quote._~23~25kernel%29._box~3f%29%29" class="RktValLink" data-pltdoc="x">box?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-box%29%29" class="RktValLink" data-pltdoc="x">impersonate-box</a></span>, but with support for immutable boxes. The
|
|
<span class="RktVar">unbox-proc</span> procedure must produce the same value or a
|
|
chaperone of the original value, and <span class="RktVar">set-proc</span> must produce
|
|
the same value or a chaperone of the value that it is given. The
|
|
<span class="RktVar">set-proc</span> will not be used if <span class="RktVar">box</span> is immutable.</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._((quote._~23~25kernel)._chaperone-hash))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-hash%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-hash</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">hash</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">ref-proc</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">set-proc</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">remove-proc</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">key-proc</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="RktVar">clear-proc</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">equal-key-proc</span><span class="RktOpt">]</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">hash</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</a></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">ref-proc</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"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span></td></tr><tr><td><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="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="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="RktPn"> .</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</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="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><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">remove-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">key-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">clear-proc</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="RktVal">#f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">#f</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">equal-key-proc</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="RktVal">#f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</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="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="RktPn"> .</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><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">#f</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-hash%29%29" class="RktValLink" data-pltdoc="x">impersonate-hash</a></span>, but with constraints on the given functions
|
|
and support for immutable hashes. The <span class="RktVar">ref-proc</span> procedure must
|
|
return a found value or a chaperone of the value. The
|
|
<span class="RktVar">set-proc</span> procedure must produce two values: the key that it
|
|
is given or a chaperone of the key and the value that it is given or a
|
|
chaperone of the value. The <span class="RktVar">remove-proc</span>, <span class="RktVar">key-proc</span>,
|
|
and <span class="RktVar">equal-key-proc</span>
|
|
procedures must produce the given key or a chaperone of the key.</div></p><p class="SHistory">Changed in version 6.3.0.11 of package <span class="stt">base</span>: Added the <span class="RktVar">equal-key-proc</span>
|
|
argument.</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._((quote._~23~25kernel)._chaperone-struct-type))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct-type%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-struct-type</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">struct-type</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">struct-info-proc</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">make-constructor-proc</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">guard-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-type~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">struct-type</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="structutils.html#%28def._%28%28quote._~23~25kernel%29._struct-type~3f%29%29" class="RktValLink" data-pltdoc="x">struct-type?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">struct-info-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">make-constructor-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">guard-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns a chaperoned value like <span class="RktVar">struct-type</span>, but with
|
|
<span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-info%29%29" class="RktValLink" data-pltdoc="x">struct-type-info</a></span> and <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-make-constructor%29%29" class="RktValLink" data-pltdoc="x">struct-type-make-constructor</a></span>
|
|
operations on the chaperoned structure type redirected. In addition,
|
|
when a new structure type is created as a subtype of the chaperoned
|
|
structure type, <span class="RktVar">guard-proc</span> is interposed as an extra guard on
|
|
creation of instances of the subtype.</div></p><p>The <span class="RktVar">struct-info-proc</span> must accept 8 arguments—<wbr></wbr>the result of
|
|
<span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-info%29%29" class="RktValLink" data-pltdoc="x">struct-type-info</a></span> on <span class="RktVar">struct-type</span>. It must return 8
|
|
values, where each is the same or a chaperone of the corresponding
|
|
argument. The 8 values are used as the results of
|
|
<span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-info%29%29" class="RktValLink" data-pltdoc="x">struct-type-info</a></span> for the chaperoned structure type.</p><p>The <span class="RktVar">make-constructor-proc</span> must accept a single procedure
|
|
argument, which is a constructor produced by
|
|
<span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-make-constructor%29%29" class="RktValLink" data-pltdoc="x">struct-type-make-constructor</a></span> on <span class="RktVar">struct-type</span>. It must
|
|
return the same or a chaperone of the procedure, which is used as the
|
|
result of <span class="RktSym"><a href="inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-make-constructor%29%29" class="RktValLink" data-pltdoc="x">struct-type-make-constructor</a></span> on the chaperoned
|
|
structure type.</p><p>The <span class="RktVar">guard-proc</span> is like a <span class="RktSym">guard</span> argument to
|
|
<span class="RktSym"><a href="creatingmorestructs.html#%28def._%28%28quote._~23~25kernel%29._make-struct-type%29%29" class="RktValLink" data-pltdoc="x">make-struct-type</a></span>: it must accept one more argument
|
|
than a constructor for <span class="RktVar">struct-type</span>, where the last argument
|
|
is the name the name of the instantiated structure type.
|
|
It must return the number of values needed by the constructor
|
|
(i.e. one value for each argument but the last),
|
|
and each returned value must be the same as
|
|
or a chaperone of the corresponding argument.
|
|
The <span class="RktVar">guard-proc</span> is added as a constructor guard when a subtype is
|
|
created of the chaperoned structure type.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-struct-type%29%29" class="RktValLink" data-pltdoc="x">chaperone-struct-type</a></span> must be even) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">struct-type</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._((quote._~23~25kernel)._chaperone-evt))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-evt%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-evt</a></span></span><span class="hspace"> </span><span class="RktVar">evt</span><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span><span class="RktVar">prop</span><span class="hspace"> </span><span class="RktVar">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="hspace"> </span><span class="RktMeta">...</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="sync.html#%28def._%28%28quote._~23~25kernel%29._evt~3f%29%29" class="RktValLink" data-pltdoc="x">evt?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">evt</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._evt~3f%29%29" class="RktValLink" data-pltdoc="x">evt?</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="sync.html#%28def._%28%28quote._~23~25kernel%29._evt~3f%29%29" class="RktValLink" data-pltdoc="x">evt?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span><span class="hspace"> </span><span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._evt~3f%29%29" class="RktValLink" data-pltdoc="x">evt?</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._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/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="RktPn"> .</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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">Returns a chaperoned value like <span class="RktVar">evt</span>, but with <span class="RktVar">proc</span>
|
|
as an event generator when the result is synchronized with functions
|
|
like <span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._sync%29%29" class="RktValLink" data-pltdoc="x">sync</a></span>.</div></p><p>The <span class="RktVar">proc</span> generator is called on synchronization, much like
|
|
the procedure passed to <span class="RktSym"><a href="sync.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._guard-evt%29%29" class="RktValLink" data-pltdoc="x">guard-evt</a></span>, except that <span class="RktVar">proc</span>
|
|
is given <span class="RktVar">evt</span>. The <span class="RktVar">proc</span> must return two values: a
|
|
<a href="sync.html#%28tech._synchronizable._event%29" class="techoutside" data-pltdoc="x"><span class="techinside">synchronizable event</span></a> that is a chaperone of <span class="RktVar">evt</span>, and a
|
|
procedure that is used to check the event’s result if it is chosen in
|
|
a selection. The latter procedure accepts the result of <span class="RktVar">evt</span>,
|
|
and it must return a chaperone of that value.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-evt%29%29" class="RktValLink" data-pltdoc="x">chaperone-evt</a></span> must be even) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">evt</span>.</p><p>The result is <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> the argument <span class="RktVar">evt</span>.
|
|
However, if <span class="RktVar">evt</span> is a <a href="eval-model.html#%28tech._thread%29" class="techoutside" data-pltdoc="x"><span class="techinside">thread</span></a>, <a href="semaphore.html#%28tech._semaphore%29" class="techoutside" data-pltdoc="x"><span class="techinside">semaphore</span></a>,
|
|
<a href="ports.html#%28tech._input._port%29" class="techoutside" data-pltdoc="x"><span class="techinside">input port</span></a>, <a href="ports.html#%28tech._output._port%29" class="techoutside" data-pltdoc="x"><span class="techinside">output port</span></a>, or <a href="willexecutor.html#%28tech._will._executor%29" class="techoutside" data-pltdoc="x"><span class="techinside">will executor</span></a>, the
|
|
result is not recognized as such. For example, <span class="RktSym"><a href="threads.html#%28def._%28%28quote._~23~25kernel%29._thread~3f%29%29" class="RktValLink" data-pltdoc="x">thread?</a></span>
|
|
applied to the result of <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-evt%29%29" class="RktValLink" data-pltdoc="x">chaperone-evt</a></span> will always produce
|
|
<span class="RktVal">#f</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._chaperone-channel))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-channel%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-channel</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">channel</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">get-proc</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">put-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</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="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="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">channel</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">get-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span><span class="hspace"> </span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/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="RktPn"> .</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">put-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="channel.html#%28def._%28%28quote._~23~25kernel%29._channel~3f%29%29" class="RktValLink" data-pltdoc="x">channel?</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="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="RktPn"> .</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><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-channel%29%29" class="RktValLink" data-pltdoc="x">impersonate-channel</a></span>, but with restrictions on the
|
|
<span class="RktVar">get-proc</span> and <span class="RktVar">put-proc</span> procedures.</div></p><p>The <span class="RktVar">get-proc</span> must return two values: a <a href="channel.html#%28tech._channel%29" class="techoutside" data-pltdoc="x"><span class="techinside">channel</span></a>
|
|
that is a chaperone of <span class="RktVar">channel</span>, and a procedure that
|
|
is used to check the channel’s contents. The latter procedure
|
|
must return the original value or a chaperone of that value.</p><p>The <span class="RktVar">put-proc</span> must produce a replacement value that is
|
|
either the original value communicated on the channel or a
|
|
chaperone of that value.</p><p>Pairs of <span class="RktVar">prop</span> and <span class="RktVar">prop-val</span> (the number of arguments
|
|
to <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-channel%29%29" class="RktValLink" data-pltdoc="x">chaperone-channel</a></span> must be odd) add impersonator properties
|
|
or override impersonator-property values of <span class="RktVar">channel</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><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._chaperone-prompt-tag))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-prompt-tag%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-prompt-tag</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">prompt-tag</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">handle-proc</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">abort-proc</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="RktVar">cc-guard-proc</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">callcc-chaperone-proc</span><span class="RktOpt">]</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="cont.html#%28def._%28%28quote._~23~25kernel%29._continuation-prompt-tag~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-prompt-tag?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prompt-tag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._continuation-prompt-tag~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-prompt-tag?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">abort-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">cc-guard-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">callcc-chaperone-proc</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="RktPn">(</span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</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="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="RktPn">)</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="hspace"> </span></td><td valign="top">=</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">p</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">p</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">impersonate-prompt-tag</a></span>, but produces a chaperoned value.
|
|
The <span class="RktVar">handle-proc</span> procedure must produce the same values or
|
|
chaperones of the original values, <span class="RktVar">abort-proc</span> must produce
|
|
the same values or chaperones of the values that it is given, and
|
|
<span class="RktVar">cc-guard-proc</span> must produce the same values or chaperones of
|
|
the original result values, and <span class="RktVar">callcc-chaperone-proc</span> must
|
|
produce a procedure that is a chaperone or the same as the given
|
|
procedure.</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="RktSym">bad-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">chaperone-prompt-tag</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">make-continuation-prompt-tag</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2A%29%29" class="RktValLink" data-pltdoc="x">*</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktVal">2</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </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="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span><span class="hspace"> </span><span class="RktSym">bad-chaperone</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">bad-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktErr">abort-current-continuation: non-chaperone result; received a</span></p></td></tr><tr><td><p><span class="RktErr">prompt-abort argument that is not a chaperone of the</span></p></td></tr><tr><td><p><span class="RktErr">original prompt-abort argument</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">original: 5</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">received: 6</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="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">good-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">chaperone-prompt-tag</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="cont.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-prompt-tag%29%29" class="RktValLink" data-pltdoc="x">make-continuation-prompt-tag</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._even~3f%29%29" class="RktValLink" data-pltdoc="x">even?</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="exns.html#%28def._%28%28quote._~23~25kernel%29._error%29%29" class="RktValLink" data-pltdoc="x">error</a></span><span class="hspace"> </span><span class="RktVal">"not even"</span><span class="RktPn">)</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._even~3f%29%29" class="RktValLink" data-pltdoc="x">even?</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="exns.html#%28def._%28%28quote._~23~25kernel%29._error%29%29" class="RktValLink" data-pltdoc="x">error</a></span><span class="hspace"> </span><span class="RktVal">"not even"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="cont.html#%28def._%28%28quote._~23~25kernel%29._call-with-continuation-prompt%29%29" class="RktValLink" data-pltdoc="x">call-with-continuation-prompt</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </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="cont.html#%28def._%28%28quote._~23~25kernel%29._abort-current-continuation%29%29" class="RktValLink" data-pltdoc="x">abort-current-continuation</a></span><span class="hspace"> </span><span class="RktSym">good-chaperone</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">good-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">2</span></p></td></tr></table></blockquote></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._((quote._~23~25kernel)._chaperone-continuation-mark-key))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-continuation-mark-key%29%29" class="RktValDef RktValLink" data-pltdoc="x">chaperone-continuation-mark-key</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">key</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">get-proc</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">set-proc</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">prop</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">prop-val</span><span class="hspace"> </span><span class="RktMeta">...</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="RktMeta">...</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></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="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-key~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-key?</a></span><span class="hspace"> </span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone~3f%29%29" class="RktValLink" data-pltdoc="x">chaperone?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">key</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-key~3f%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-key?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">get-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">set-proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop</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></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prop-val</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="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonate-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">impersonate-continuation-mark-key</a></span>, but produces a
|
|
chaperoned value. The <span class="RktVar">get-proc</span> procedure must produce the
|
|
same value or a chaperone of the original value, and <span class="RktVar">set-proc</span>
|
|
must produce the same value or a chaperone of the value that it is
|
|
given.</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="RktSym">bad-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">chaperone-continuation-mark-key</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">make-continuation-mark-key</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="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">l</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29" class="RktValLink" data-pltdoc="x">map</a></span><span class="hspace"> </span><span class="RktSym"><a href="characters.html#%28def._%28%28quote._~23~25kernel%29._char-upcase%29%29" class="RktValLink" data-pltdoc="x">char-upcase</a></span><span class="hspace"> </span><span class="RktSym">l</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string-~3elist%29%29" class="RktValLink" data-pltdoc="x">string->list</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span><span class="hspace"> </span><span class="RktSym">bad-chaperone</span><span class="hspace"> </span><span class="RktVal">"timballo"</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-set-first%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-set-first</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._current-continuation-marks%29%29" class="RktValLink" data-pltdoc="x">current-continuation-marks</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">bad-chaperone</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktErr">with-continuation-mark: non-chaperone result; received a</span></p></td></tr><tr><td><p><span class="RktErr">value that is not a chaperone of the original value</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">original: "timballo"</span></p></td></tr><tr><td><p><span class="RktErr"></span><span class="hspace"> </span><span class="RktErr">received: '(#\t #\i #\m #\b #\a #\l #\l #\o)</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="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">checker</span><span class="hspace"> </span><span class="RktSym">s</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="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._~3e%29%29" class="RktValLink" data-pltdoc="x">></a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string-length%29%29" class="RktValLink" data-pltdoc="x">string-length</a></span><span class="hspace"> </span><span class="RktSym">s</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">s</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="exns.html#%28def._%28%28quote._~23~25kernel%29._error%29%29" class="RktValLink" data-pltdoc="x">error</a></span><span class="hspace"> </span><span class="RktVal">"expected string of length at least 5"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="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">good-chaperone</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._chaperone-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">chaperone-continuation-mark-key</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._make-continuation-mark-key%29%29" class="RktValLink" data-pltdoc="x">make-continuation-mark-key</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">checker</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">checker</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></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="wcm.html#%28form._%28%28quote._~23~25kernel%29._with-continuation-mark%29%29" class="RktStxLink" data-pltdoc="x">with-continuation-mark</a></span><span class="hspace"> </span><span class="RktSym">good-chaperone</span><span class="hspace"> </span><span class="RktVal">"zabaione"</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._continuation-mark-set-first%29%29" class="RktValLink" data-pltdoc="x">continuation-mark-set-first</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="contmarks.html#%28def._%28%28quote._~23~25kernel%29._current-continuation-marks%29%29" class="RktValLink" data-pltdoc="x">current-continuation-marks</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">good-chaperone</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">"zabaione"</span></p></td></tr></table></blockquote></div></p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Impersonator_Properties"">14.5.3<tt> </tt><a name="(part._.Impersonator_.Properties)"></a>Impersonator Properties</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._((quote._~23~25kernel)._make-impersonator-property))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._make-impersonator-property%29%29" class="RktValDef RktValLink" data-pltdoc="x">make-impersonator-property</a></span></span><span class="hspace"> </span><span class="RktVar">name</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="prototype"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><table cellspacing="0" cellpadding="0"><tr><td><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></td></tr><tr><td><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></td></tr><tr><td><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="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator~3f%29%29" class="RktValLink" data-pltdoc="x">impersonator?</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%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">name</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></table></blockquote></div><div class="SIntrapara">Creates a new <a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator property</span></a> and returns three values:</div></p><ul><li><p>an <a name="(tech._impersonator._property._descriptor)"></a><span style="font-style: italic">impersonator property descriptor</span>, for use with
|
|
<span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span>, <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%29%29" class="RktValLink" data-pltdoc="x">chaperone-procedure</a></span>,
|
|
and other impersonator constructors;</p></li><li><p>an <a name="(tech._impersonator._property._predicate)"></a><span style="font-style: italic">impersonator property predicate</span> procedure, which takes
|
|
an arbitrary value and returns <span class="RktVal">#t</span> if the value is an
|
|
impersonator with a value for the property, <span class="RktVal">#f</span>
|
|
otherwise;</p></li><li><p>an <a name="(tech._impersonator._property._accessor)"></a><span style="font-style: italic">impersonator property accessor</span> procedure, which
|
|
returns the value associated with an impersonator for the property;
|
|
if a value given to the accessor is not an impersonator or does not
|
|
have a value for the property (i.e. if the corresponding impersonator
|
|
property predicate returns <span class="RktVal">#f</span>), then a second optional argument
|
|
to the selector determines its response: the <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> exception is raised
|
|
if a second argument is not provided, the second argument is tail-called
|
|
with zero arguments if it is a procedure, and the second argument is returned
|
|
otherwise.</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>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._impersonator-property~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-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></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> if <span class="RktVar">v</span> is a <a href="chaperones.html#%28tech._impersonator._property._descriptor%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator property
|
|
descriptor</span></a> value, <span class="RktVal">#f</span> otherwise.</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._((quote._~23~25kernel)._impersonator-property-accessor-procedure~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-accessor-procedure~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-property-accessor-procedure?</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">Returns <span class="RktVal">#t</span> if <span class="RktVar">v</span> is an accessor procedure produced
|
|
by <span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._make-impersonator-property%29%29" class="RktValLink" data-pltdoc="x">make-impersonator-property</a></span>, <span class="RktVal">#f</span> otherwise.</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>value</p></div></div><p class="RForeground"><a name="(def._((quote._~23~25kernel)._impersonator-prop~3aapplication-mark))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-prop~3aapplication-mark%29%29" class="RktValDef RktValLink" data-pltdoc="x">impersonator-prop:application-mark</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></blockquote></div><div class="SIntrapara">An <a href="chaperones.html#%28tech._impersonator._property%29" class="techoutside" data-pltdoc="x"><span class="techinside">impersonator property</span></a> that is recognized by <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._impersonate-procedure%29%29" class="RktValLink" data-pltdoc="x">impersonate-procedure</a></span>
|
|
and <span class="RktSym"><a href="chaperones.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._chaperone-procedure%29%29" class="RktValLink" data-pltdoc="x">chaperone-procedure</a></span>.</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="Module_Names_and_Loading.html" title="backward to "14.4 Module Names and Loading"" data-pltdoc="x">← prev</a> <a href="security.html" title="up to "14 Reflection and Security"" data-pltdoc="x">up</a> <a href="securityguards.html" title="forward to "14.6 Security Guards"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html> |