56 lines
36 KiB
HTML
56 lines
36 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>13.10 Fast-Load Serialization</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="tocviewselflink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18 </td><td><a href="running.html"
|
||
|
string, printing it directly to <span class="RktVar">out</span> if <span class="RktVar">out</span> is an
|
||
|
output port or returning the byte string otherwise. The
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span> function decodes a value from a byte string
|
||
|
(supplied either directly or as an input port) that was encoded with
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span>.</div></p><p>The <span class="RktVar">v</span> argument must be a value that could be <span class="RktSym"><a href="quote.html#%28form._%28%28quote._~23~25kernel%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>d
|
||
|
as a literal—<wbr></wbr>that is, a value without syntax objects for which
|
||
|
<span class="RktPn">(</span><span class="RktSym"><a href="eval.html#%28def._%28%28quote._~23~25kernel%29._compile%29%29" class="RktValLink" data-pltdoc="x">compile</a></span><span class="stt"> </span><span class="RktVal">`</span><span class="RktVal">'</span><span class="RktVal">,</span><span class="RktVal">v</span><span class="RktPn">)</span> would work and be <span class="RktSym"><a href="Reading.html#%28def._%28%28quote._~23~25kernel%29._read%29%29" class="RktValLink" data-pltdoc="x">read</a></span>able
|
||
|
after <span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29" class="RktValLink" data-pltdoc="x">write</a></span>—<wbr></wbr>or it can include <a href="linklets.html#%28tech._correlated._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">correlated
|
||
|
objects</span></a> mixed with those values. The byte string produced by
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> does not use the same format as compiled code,
|
||
|
however.</p><p>If a value within <span class="RktVar">v</span> is not valid as a <span class="RktSym"><a href="quote.html#%28form._%28%28quote._~23~25kernel%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>d
|
||
|
literal, and if <span class="RktVar">handle-fail</span> is not <span class="RktVal">#f</span>, then
|
||
|
<span class="RktVar">handle-fail</span> is called on the nested value, and the result of
|
||
|
<span class="RktVar">handle-fail</span> is written in that value’s place. The
|
||
|
<span class="RktVar">handle-fail</span> procedure might raise an exception instead of
|
||
|
returning a replacement value. If <span class="RktVar">handle-fail</span> is <span class="RktVal">#f</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 when an invalid value is
|
||
|
encountered.</p><p>If <span class="RktVar">external-lift?</span> is not <span class="RktVal">#f</span>, then it receives each
|
||
|
value <span class="RktVar">v-sub</span> encountered in <span class="RktVar">v</span> by
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span>. If the result of <span class="RktVar">external-lift?</span> on
|
||
|
<span class="RktVar">v-sub</span> is true, then <span class="RktVar">v-sub</span> is not encoded in the
|
||
|
result, and it instead treated as <a name="(tech._externally._lifted)"></a><span style="font-style: italic">externally lifted</span>. A
|
||
|
deserializing <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span> receives a <span class="RktVar">external-lifts</span>
|
||
|
vector that has one value for each externally lifted value, in the
|
||
|
same order as passed to <span class="RktVar">external-lift?</span> on serialization.</p><p>Like <span class="RktPn">(</span><span class="RktSym"><a href="eval.html#%28def._%28%28quote._~23~25kernel%29._compile%29%29" class="RktValLink" data-pltdoc="x">compile</a></span><span class="stt"> </span><span class="RktVal">`</span><span class="RktVal">'</span><span class="RktVal">,</span><span class="RktVal">v</span><span class="RktPn">)</span>, <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> does not
|
||
|
preserve graph structure, support cycles, or handle non-<a href="structures.html#%28tech._prefab%29" class="techoutside" data-pltdoc="x"><span class="techinside">prefab</span></a>
|
||
|
structures. Compose <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> with <span class="RktSym"><a href="serialization.html#%28def._%28%28lib._racket%2Fprivate%2Fserialize..rkt%29._serialize%29%29" class="RktValLink" data-pltdoc="x">serialize</a></span> to
|
||
|
preserve graph structure, handle cyclic data, and encode serializable
|
||
|
structures. The <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> and <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span>
|
||
|
functions consult <span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._current-write-relative-directory%29%29" class="RktValLink" data-pltdoc="x">current-write-relative-directory</a></span> and
|
||
|
<span class="RktSym"><a href="eval.html#%28def._%28%28quote._~23~25kernel%29._current-load-relative-directory%29%29" class="RktValLink" data-pltdoc="x">current-load-relative-directory</a></span>
|
||
|
(falling back to <span class="RktSym"><a href="Filesystem.html#%28def._%28%28quote._~23~25kernel%29._current-directory%29%29" class="RktValLink" data-pltdoc="x">current-directory</a></span>), respectively, in the same
|
||
|
way as bytecode saving and loading to store paths in relative form,
|
||
|
and they similarly allow and convert constrained <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._srcloc%29%29" class="RktValLink" data-pltdoc="x">srcloc</a></span>
|
||
|
values (see <a href="printing.html#%28part._print-compiled%29" data-pltdoc="x">Printing Compiled Code</a>).</p><p>Unless <span class="RktVar">keep-mutable?</span> is provided as true to
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span>, then mutable values in <span class="RktVar">v</span> are replaced
|
||
|
by immutable values when the result is decoded by
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span>. Unless <span class="RktVar">datum-intern?</span> is provided as
|
||
|
<span class="RktVal">#f</span>, then any immutable value produced by <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span>
|
||
|
is filtered by <span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._datum-intern-literal%29%29" class="RktValLink" data-pltdoc="x">datum-intern-literal</a></span>. The defaults make the
|
||
|
composition of <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> and <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span> behave
|
||
|
like the composition of <span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29" class="RktValLink" data-pltdoc="x">write</a></span> and <span class="RktSym"><a href="Reading.html#%28def._%28%28quote._~23~25kernel%29._read%29%29" class="RktValLink" data-pltdoc="x">read</a></span>.</p><p>If <span class="RktVar">skip-prefix?</span> is not <span class="RktVal">#f</span>, then a prefix that
|
||
|
identifies the stream as a serialization is not written by
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> or read by <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span>. Omitting a
|
||
|
prefix can save a small amount of space, which can useful when
|
||
|
serializing small values, but it gives up a sanity check on the
|
||
|
<span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span> that is often useful.</p><p>The byte-string encoding produced by <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> is
|
||
|
independent of the Racket version, except as future Racket versions
|
||
|
introduce extensions that are not currently recognized. In particular,
|
||
|
the result of <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> will be valid as input to any
|
||
|
future version of <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span> (as long as the
|
||
|
<span class="RktVar">skip-prefix?</span> arguments are consistent).</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="RktSym">fasl</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</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">#</span><span class="RktVal">(</span><span class="RktVal">"speed"</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">racer</span><span class="hspace"> </span><span class="RktVal">#\!</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktSym">fasl</span></td></tr><tr><td><p><span class="RktRes">#"racket/fasl:\0\24\34\3 \1\23\5speed\16\5racer\r!"</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29" class="RktValLink" data-pltdoc="x">fasl->s-exp</a></span><span class="hspace"> </span><span class="RktSym">fasl</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(#("speed") racer #\!)</span></p></td></tr></table></blockquote></div></p><p class="SHistory">Changed in version 6.90.0.21 of package <span class="stt">base</span>: Made <span class="RktSym"><a href="fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29" class="RktValLink" data-pltdoc="x">s-exp->fasl</a></span> format version-independent
|
||
|
and added the <span class="RktPn">#:keep-mutable?</span>
|
||
|
and <span class="RktPn">#:datum-intern?</span> arguments.<br/>Changed in version 7.3.0.7: Added support for <a href="linklets.html#%28tech._correlated._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">correlated objects</span></a>.<br/>Changed in version 7.5.0.3: Added the <span class="RktPn">#:handle-fail</span> argument.<br/>Changed in version 7.5.0.9: Added the <span class="RktPn">#:external-lift?</span> and <span class="RktPn">#:external-lifts</span> arguments.</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="serialization.html" title="backward to "13.9 Serialization"" data-pltdoc="x">← prev</a> <a href="input-and-output.html" title="up to "13 Input and Output"" data-pltdoc="x">up</a> <a href="sha.html" title="forward to "13.11 Cryptographic Hashing"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html>
|