emacs.d/clones/docs.racket-lang.org/reference/Delayed_Evaluation.html
2022-08-24 19:36:32 +02:00

59 lines
No EOL
41 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>10.3&nbsp;Delayed Evaluation</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,&quot;tocview_0&quot;);">&#9658;</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&nbsp;</td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3&nbsp;</td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4&nbsp;</td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7&nbsp;</td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8&nbsp;</td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9&nbsp;</td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10&nbsp;</td><td><a href="control.html" class="tocviewselflink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11&nbsp;</td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12&nbsp;</td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13&nbsp;</td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14&nbsp;</td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15&nbsp;</td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16&nbsp;</td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17&nbsp;</td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18&nbsp;</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,&quot;tocview_1&quot;);">&#9660;</a></td><td>10&nbsp;</td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr></table><div class="tocviewsublist" style="display: block;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">10.1&nbsp;</td><td><a href="values.html" class="tocviewlink" data-pltdoc="x">Multiple Values</a></td></tr><tr><td align="right">10.2&nbsp;</td><td><a href="exns.html" class="tocviewlink" data-pltdoc="x">Exceptions</a></td></tr><tr><td align="right">10.3&nbsp;</td><td><a href="Delayed_Evaluation.html" class="tocviewselflink" data-pltdoc="x">Delayed Evaluation</a></td></tr><tr><td align="right">10.4&nbsp;</td><td><a href="cont.html" class="tocviewlink" data-pltdoc="x">Continuations</a></td></tr><tr><td align="right">10.5&nbsp;</td><td><a href="contmarks.html" class="tocviewlink" data-pltdoc="x">Continuation Marks</a></td></tr><tr><td align="right">10.6&nbsp;</td><td><a href="breakhandler.html" class="tocviewlink" data-pltdoc="x">Breaks</a></td></tr><tr><td align="right">10.7&nbsp;</td><td><a href="Exiting.html" class="tocviewlink" data-pltdoc="x">Exiting</a></td></tr><tr><td align="right">10.8&nbsp;</td><td><a href="unreachable.html" class="tocviewlink" data-pltdoc="x">Unreachable Expressions</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,&quot;tocview_2&quot;);">&#9658;</a></td><td>10.3&nbsp;</td><td><a href="Delayed_Evaluation.html" class="tocviewselflink" data-pltdoc="x">Delayed Evaluation</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_2"><table cellspacing="0" cellpadding="0"><tr><td align="right">10.3.1&nbsp;</td><td><a href="Delayed_Evaluation.html#%28part._.Additional_.Promise_.Kinds%29" class="tocviewlink" data-pltdoc="x">Additional Promise Kinds</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="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">promise?</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._lazy%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">lazy</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">force</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-forced~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">promise-<wbr></wbr>forced?</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-running~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">promise-<wbr></wbr>running?</span></span></a></td></tr><tr><td><span class="tocsublinknumber">10.3.1<tt>&nbsp;</tt></span><a href="Delayed_Evaluation.html#%28part._.Additional_.Promise_.Kinds%29" class="tocsubseclink" data-pltdoc="x">Additional Promise Kinds</a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fname%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay/<span class="mywbr"> &nbsp;</span>name</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise%2Fname~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">promise/<span class="mywbr"> &nbsp;</span>name?</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fstrict%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay/<span class="mywbr"> &nbsp;</span>strict</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fsync%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay/<span class="mywbr"> &nbsp;</span>sync</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fthread%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay/<span class="mywbr"> &nbsp;</span>thread</span></span></a></td></tr><tr><td><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fidle%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">delay/<span class="mywbr"> &nbsp;</span>idle</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, &quot;8.6&quot;, &quot;../&quot;);"/></form>&nbsp;&nbsp;<a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot(&quot;8.6&quot;);">top</a><span class="tocsettoggle">&nbsp;&nbsp;<a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright">&nbsp;&nbsp;<a href="exns.html" title="backward to &quot;10.2 Exceptions&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="control.html" title="up to &quot;10 Control Flow&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="cont.html" title="forward to &quot;10.4 Continuations&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div><h4 x-source-module="(lib &quot;scribblings/reference/reference.scrbl&quot;)" x-source-pkg="racket-doc" x-part-tag="&quot;Delayed_Evaluation&quot;">10.3<tt>&nbsp;</tt><a name="(part._.Delayed_.Evaluation)"></a><a name="(mod-path._racket/promise)"></a>Delayed Evaluation</h4><p><div class="SIntrapara"><table cellspacing="0" cellpadding="0" class="defmodule"><tr><td align="left"><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="stt"> </span><a href="Delayed_Evaluation.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/promise</span></a><span class="RktPn">)</span></td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <a href="https://pkgs.racket-lang.org/package/base" title="Install this package using `raco pkg install base`"><span class="stt">base</span></a></span></td></tr></table></div><div class="SIntrapara">The bindings documented in this section are provided by the <a href="Delayed_Evaluation.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/promise</span></a> and <a href="index.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket</span></a> libraries, but not <a href="index.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/base</span></a>.</div></p><p>A <a name="(tech._promise)"></a><span style="font-style: italic">promise</span> encapsulates an expression to be evaluated on
demand via <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>. After a promise has been <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>d,
every later <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> of the promise produces the same result.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/promise..rkt)._promise~3f))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">promise?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">v</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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 promise, <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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Creates a promise that, when <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>d, evaluates the
<span class="RktVar">body</span>s to produce its value. The result is then cached, so
further uses of <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> produce the cached value immediately.
This includes multiple values and exceptions.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._lazy))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._lazy%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">lazy</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="RktStxLink" data-pltdoc="x">delay</a></span>, if the last <span class="RktVar">body</span> produces a promise when
forced, then this promise is <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>d, too, to obtain a value.
In other words, this form creates a composable promise, where the
computation of its body is &ldquo;attached&rdquo; to the computation of the
following promise, and a single <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> iterates through the
whole chain, tail-calling each step.</div></p><p>Note that the last <span class="RktVar">body</span> of this form must produce a single
value, but the value can itself be a <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="RktStxLink" data-pltdoc="x">delay</a></span> promise that
returns multiple values.</p><p>The <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._lazy%29%29" class="RktStxLink" data-pltdoc="x">lazy</a></span> form is useful for implementing lazy libraries and
languages, where tail calls can be wrapped in a promise.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/promise..rkt)._force))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValDef RktValLink" data-pltdoc="x">force</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">v</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">If <span class="RktVar">v</span> is a promise, then the promise is forced to obtain a
value. If the promise has not been forced before, then the result is
recorded in the promise so that future <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>s on the promise
produce the same value (or values). If forcing the promise raises an
exception, then the exception is similarly recorded so that forcing
the promise will raise the same exception every time.</div></p><p>If <span class="RktVar">v</span> is <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>d again before the original call to
<span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> returns, then the <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail%29%29" class="RktValLink" data-pltdoc="x">exn:fail</a></span> exception is raised.</p><p>If <span class="RktVar">v</span> is not a promise, then it is returned as the result.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/promise..rkt)._promise-forced~3f))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-forced~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">promise-forced?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">promise</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">promise</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise~3f%29%29" class="RktValLink" data-pltdoc="x">promise?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> if <span class="RktVar">promise</span> has been forced.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/promise..rkt)._promise-running~3f))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-running~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">promise-running?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">promise</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">promise</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise~3f%29%29" class="RktValLink" data-pltdoc="x">promise?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> if <span class="RktVar">promise</span> is currently being forced.
(Note that a promise can be either running or forced but not both.)</div></p><h5 x-source-module="(lib &quot;scribblings/reference/reference.scrbl&quot;)" x-source-pkg="racket-doc" x-part-tag="&quot;Additional_Promise_Kinds&quot;">10.3.1<tt>&nbsp;</tt><a name="(part._.Additional_.Promise_.Kinds)"></a>Additional Promise Kinds</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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay/name))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fname%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay/name</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Creates a &ldquo;call-by-name&rdquo; promise that is similar to
<span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="RktStxLink" data-pltdoc="x">delay</a></span>-promises, except that the resulting value is not
cached. This kind of promise is essentially a thunk that is wrapped
in a way that <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> recognizes.</div></p><p>If a <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fname%29%29" class="RktStxLink" data-pltdoc="x">delay/name</a></span> promise forces itself, no exception is
raised, the promise is never considered &ldquo;running&rdquo; or &ldquo;forced&rdquo; in
the sense of <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-running~3f%29%29" class="RktValLink" data-pltdoc="x">promise-running?</a></span> and <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise-forced~3f%29%29" class="RktValLink" data-pltdoc="x">promise-forced?</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._((lib._racket/promise..rkt)._promise/name~3f))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._promise%2Fname~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">promise/name?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">promise</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">promise</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">promise</span> is a promise created with <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fname%29%29" class="RktStxLink" data-pltdoc="x">delay/name</a></span>.
</div><div class="SIntrapara"><p class="SHistory">Added in version 6.3 of package <span class="stt">base</span>.</p></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay/strict))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fstrict%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay/strict</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Creates a &ldquo;strict&rdquo; promise: it is evaluated immediately, and the
result is wrapped in a promise value. Note that the body can evaluate
to multiple values, and forcing the resulting promise will return these
values.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay/sync))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fsync%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay/sync</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Produces a promise where an attempt to <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> the promise by a
thread other than one currently running the promise causes the
<span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> to block until a result is available. This kind of
promise is also a <a href="sync.html#%28tech._synchronizable._event%29" class="techoutside" data-pltdoc="x"><span class="techinside">synchronizable event</span></a> for use with
<span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._sync%29%29" class="RktValLink" data-pltdoc="x">sync</a></span>; <span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._sync%29%29" class="RktValLink" data-pltdoc="x">sync</a></span>ing on the promise does not <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>
it, but merely waits until a value is forced by another thread.
The <a href="sync.html#%28tech._synchronization._result%29" class="techoutside" data-pltdoc="x"><span class="techinside">synchronization result</span></a> is <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=guide&amp;rel=void_undefined.html&amp;version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#&lt;void&gt;</span></span></a>.</div></p><p>If a promise created by <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fsync%29%29" class="RktStxLink" data-pltdoc="x">delay/sync</a></span> is forced on a thread that
is already running the promise, an exception is raised in the same way
as for promises created with <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%29%29" class="RktStxLink" data-pltdoc="x">delay</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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay/thread))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fthread%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay/thread</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body/option</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">body/option</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">=</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktVar">body</span></td></tr><tr><td align="right" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktPn">#:group</span><span class="hspace">&nbsp;</span><span class="RktVar">thread-group-expr</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fsync%29%29" class="RktStxLink" data-pltdoc="x">delay/sync</a></span>, but begins the computation immediately on a
newly created thread. The thread is created under the <a href="threadgroups.html#%28tech._thread._group%29" class="techoutside" data-pltdoc="x"><span class="techinside">thread
group</span></a> specified by <span class="RktVar">thread-group-expr</span>, which defaults to
<span class="RktPn">(</span><span class="RktSym"><a href="threadgroups.html#%28def._%28%28quote._~23~25kernel%29._make-thread-group%29%29" class="RktValLink" data-pltdoc="x">make-thread-group</a></span><span class="RktPn">)</span>. A <span class="RktPn">#:group</span> specification can
appear at most once.</div></p><p>Exceptions raised by the <span class="RktVar">body</span>s are caught as usual and raised
only when the promise is <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span>d. Unlike <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fsync%29%29" class="RktStxLink" data-pltdoc="x">delay/sync</a></span>,
if the thread running <span class="RktVar">body</span> terminates without producing a result
or exception, <span class="RktSym"><a href="Delayed_Evaluation.html#%28def._%28%28lib._racket%2Fpromise..rkt%29._force%29%29" class="RktValLink" data-pltdoc="x">force</a></span> of the promise raises an exception (instead
of blocking).</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/promise..rkt)._delay/idle))"></a><span title="Provided from: racket/promise, racket | Package: base"><span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fidle%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">delay/idle</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body/option</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">body/option</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">=</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktVar">body</span></td></tr><tr><td align="right" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktPn">#:wait-for</span><span class="hspace">&nbsp;</span><span class="RktVar">wait-evt-expr</span></td></tr><tr><td align="right" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktPn">#:work-while</span><span class="hspace">&nbsp;</span><span class="RktVar">while-evt-expr</span></td></tr><tr><td align="right" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktPn">#:tick</span><span class="hspace">&nbsp;</span><span class="RktVar">tick-secs-expr</span></td></tr><tr><td align="right" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="RktPn">#:use</span><span class="hspace">&nbsp;</span><span class="RktVar">use-ratio-expr</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="Delayed_Evaluation.html#%28form._%28%28lib._racket%2Fpromise..rkt%29._delay%2Fthread%29%29" class="RktStxLink" data-pltdoc="x">delay/thread</a></span>, but with the following differences:</div></p><ul><li><p>the computation does not start until the event produced by
<span class="RktVar">wait-evt-expr</span> is ready, where the default is
<span class="RktPn">(</span><span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._system-idle-evt%29%29" class="RktValLink" data-pltdoc="x">system-idle-evt</a></span><span class="RktPn">)</span>;</p></li><li><p>the computation thread gets to work only when the process is
otherwise idle as determined by <span class="RktVar">while-evt-expr</span>, which
also defaults to <span class="RktPn">(</span><span class="RktSym"><a href="sync.html#%28def._%28%28quote._~23~25kernel%29._system-idle-evt%29%29" class="RktValLink" data-pltdoc="x">system-idle-evt</a></span><span class="RktPn">)</span>;</p></li><li><p>the thread is allowed to run only periodically: out of every
<span class="RktVar">tick-secs-expr</span> (defaults to <span class="RktVal">0.2</span>) seconds, the
thread is allowed to run <span class="RktVar">use-ratio-expr</span> (defaults to
<span class="RktVal">0.12</span>) of the time proportionally; i.e., the thread
runs for <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="stt"> </span><span class="RktVar">tick-secs-expr</span><span class="stt"> </span><span class="RktVar">use-ratio-expr</span><span class="RktPn">)</span> seconds.</p></li></ul><p>If the promise is <span class="RktSym">forced</span> before the computation is done, it
runs the rest of the computation immediately without waiting on events
or periodically restricting evaluation.</p><p>A <span class="RktPn">#:wait-for</span>, <span class="RktPn">#:work-while</span>, <span class="RktPn">#:tick</span>, or
<span class="RktPn">#:use</span> specification can appear at most once.</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, &quot;8.6&quot;, &quot;../&quot;);"/></form>&nbsp;&nbsp;<a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot(&quot;8.6&quot;);">top</a><span class="tocsettoggle">&nbsp;&nbsp;<a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright">&nbsp;&nbsp;<a href="exns.html" title="backward to &quot;10.2 Exceptions&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="control.html" title="up to &quot;10 Control Flow&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="cont.html" title="forward to &quot;10.4 Continuations&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>