marketplace-2014/high-level-interface.html

171 lines
145 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" /><title>2&nbsp;High-level interface</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default" /><link rel="stylesheet" type="text/css" href="racket.css" title="default" /><link rel="stylesheet" type="text/css" href="footnote.css" title="default" /><link rel="stylesheet" type="text/css" href="scribble-style.css" title="default" /><script type="text/javascript" src="scribble-common.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="scribble-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist" style="margin-bottom: 1em;"><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;);">&#9660;</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">Marketplace:<span class="mywbr"> &nbsp;</span> Network-<wbr></wbr>Aware Programming</a></td></tr></table></div><div class="tocviewsublisttop" style="display: block;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1&nbsp;</td><td><a href="Concepts.html" class="tocviewlink" data-pltdoc="x">Concepts</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="" class="tocviewselflink" data-pltdoc="x">High-<wbr></wbr>level interface</a></td></tr><tr><td align="right">3&nbsp;</td><td><a href="low-level-interface.html" class="tocviewlink" data-pltdoc="x">Low-<wbr></wbr>level interface</a></td></tr><tr><td align="right">4&nbsp;</td><td><a href="Drivers.html" class="tocviewlink" data-pltdoc="x">Drivers</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="Management_and_Monitoring.html" class="tocviewlink" data-pltdoc="x">Management and Monitoring</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="Examples.html" class="tocviewlink" data-pltdoc="x">Examples</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;);">&#9658;</a></td><td>2&nbsp;</td><td><a href="" class="tocviewselflink" data-pltdoc="x">High-<wbr></wbr>level interface</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">2.1&nbsp;</td><td><a href="#%28part._hashlang-variations%29" class="tocviewlink" data-pltdoc="x">Using <span class="stt">#lang marketplace</span> and friends</a></td></tr><tr><td align="right">2.2&nbsp;</td><td><a href="#%28part._.Using_.Marketplace_as_a_library%29" class="tocviewlink" data-pltdoc="x">Using Marketplace as a library</a></td></tr><tr><td align="right">2.3&nbsp;</td><td><a href="#%28part._constructing-transitions%29" class="tocviewlink" data-pltdoc="x">Constructing transitions</a></td></tr><tr><td align="right">2.4&nbsp;</td><td><a href="#%28part._endpoint-dsl%29" class="tocviewlink" data-pltdoc="x">Creating endpoints</a></td></tr><tr><td align="right">2.5&nbsp;</td><td><a href="#%28part._deleting-endpoints%29" class="tocviewlink" data-pltdoc="x">Deleting endpoints</a></td></tr><tr><td align="right">2.6&nbsp;</td><td><a href="#%28part._.Sending_messages_and_feedback%29" class="tocviewlink" data-pltdoc="x">Sending messages and feedback</a></td></tr><tr><td align="right">2.7&nbsp;</td><td><a href="#%28part._.Creating_processes%29" class="tocviewlink" data-pltdoc="x">Creating processes</a></td></tr><tr><td align="right">2.8&nbsp;</td><td><a href="#%28part._.Exiting_and_killing_processes%29" class="tocviewlink" data-pltdoc="x">Exiting and killing processes</a></td></tr><tr><td align="right">2.9&nbsp;</td><td><a href="#%28part._.Cooperative_scheduling%29" class="tocviewlink" data-pltdoc="x">Cooperative scheduling</a></td></tr><tr><td align="right">2.10&nbsp;</td><td><a href="#%28part._.Creating_nested_.V.Ms%29" class="tocviewlink" data-pltdoc="x">Creating nested VMs</a></td></tr><tr><td align="right">2.11&nbsp;</td><td><a href="#%28part._.Relaying_across_layers%29" class="tocviewlink" data-pltdoc="x">Relaying across layers</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber">2.1<tt>&nbsp;</tt></span><a href="#(part._hashlang-variations)" class="tocsubseclink" data-pltdoc="x">Using <span class="stt">#lang marketplace</span> and friends</a></td></tr><tr><td><span class="tocsublinknumber">2.2<tt>&nbsp;</tt></span><a href="#(part._.Using_.Marketplace_as_a_library)" class="tocsubseclink" data-pltdoc="x">Using Marketplace as a library</a></td></tr><tr><td><a href="#(form._((lib._marketplace/sugar-untyped..rkt)._ground-vm))" class="tocsubnonseclink" data-pltdoc="x"><span title="Provided from: marketplace/sugar-untyped, marketplace/sugar-typed"><span class="RktSym"><span class="badlink"><span class="RktValLink">ground-<wbr></wbr>vm</span></span></span></span></a></td></tr><tr><td><a href="#(form._((lib._marketplace/sugar-untyped..rkt)._ground-vm~3a))" class="tocsubnonseclink" data-pltdoc="x"><span title="Provided from: marketplace/sugar-untyped, marketplace/sugar-typed"><span class="RktSym"><span class="badlink"><span class="RktValLink">ground-<wbr></wbr>vm:</span></span></span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.3<tt>&nbsp;</tt></span><a href="#(part._constructing-transitions)" class="tocsubseclink" data-pltdoc="x">Constructing transitions</a></td></tr><tr><td><span class="tocsublinknumber">2.4<tt>&nbsp;</tt></span><a href="#(part._endpoint-dsl)" class="tocsubseclink" data-pltdoc="x">Creating endpoints</a></td></tr><tr><td><span class="tocsublinknumber">2.4.1<tt>&nbsp;</tt></span><a href="#(part._.Receiving_messages)" class="tocsubseclink" data-pltdoc="x">Receiving messages</a></td></tr><tr><td><span class="tocsublinknumber">2.4.2<tt>&nbsp;</tt></span><a href="#(part._.Action-only_vs__.State_updates)" class="tocsubseclink" data-pltdoc="x">Action-<wbr></wbr>only vs. State updates</a></td></tr><tr><td><span class="tocsublinknumber">2.4.3<tt>&nbsp;</tt></span><a href="#(part._naming-endpoints)" class="tocsubseclink" data-pltdoc="x">Naming endpoints</a></td></tr><tr><td><span class="tocsublinknumber">2.4.4<tt>&nbsp;</tt></span><a href="#(part._.Handling_presence_and_absence_events)" class="tocsubseclink" data-pltdoc="x">Handling presence and absence events</a></td></tr><tr><td><span class="tocsublinknumber">2.4.5<tt>&nbsp;</tt></span><a href="#(part._.Exit_reasons)" class="tocsubseclink" data-pltdoc="x">Exit reasons</a></td></tr><tr><td><span class="tocsublinknumber">2.4.6<tt>&nbsp;</tt></span><a href="#(part._updating-endpoints)" class="tocsubseclink" data-pltdoc="x">Updating endpoints</a></td></tr><tr><td><span class="tocsublinknumber">2.4.7<tt>&nbsp;</tt></span><a href="#(part._.Who_am_.I_talking_to_)" class="tocsubseclink" data-pltdoc="x">Who am I talking to?</a></td></tr><tr><td><span class="tocsublinknumber">2.5<tt>&nbsp;</tt></span><a href="#(part._deleting-endpoints)" class="tocsubseclink" data-pltdoc="x">Deleting endpoints</a></td></tr><tr><td><span class="tocsublinknumber">2.6<tt>&nbsp;</tt></span><a href="#(part._.Sending_messages_and_feedback)" class="tocsubseclink" data-pltdoc="x">Sending messages and feedback</a></td></tr><tr><td><span class="tocsublinknumber">2.7<tt>&nbsp;</tt></span><a href="#(part._.Creating_processes)" class="tocsubseclink" data-pltdoc="x">Creating processes</a></td></tr><tr><td><span class="tocsublinknumber">2.8<tt>&nbsp;</tt></span><a href="#(part._.Exiting_and_killing_processes)" class="tocsubseclink" data-pltdoc="x">Exiting and killing processes</a></td></tr><tr><td><span class="tocsublinknumber">2.9<tt>&nbsp;</tt></span><a href="#(part._.Cooperative_scheduling)" class="tocsubseclink" data-pltdoc="x">Cooperative scheduling</a></td></tr><tr><td><span class="tocsublinknumber">2.10<tt>&nbsp;</tt></span><a href="#(part._.Creating_nested_.V.Ms)" class="tocsubseclink" data-pltdoc="x">Creating nested VMs</a></td></tr><tr><td><span class="tocsublinknumber">2.11<tt>&nbsp;</tt></span><a href="#(part._.Relaying_across_layers)" class="tocsubseclink" data-pltdoc="x">Relaying across layers</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="version">5.3.4.10</span></div><div class="navsettop"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="Concepts.html" title="backward to &quot;1 Concepts&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="low-level-interface.html" title="forward to &quot;3 Low-level interface&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div><h3>2<tt>&nbsp;</tt><a name="(part._high-level-interface)"></a>High-level interface</h3><p>This high-level interface between a VM and a process is analogous to
the <span style="font-style: italic">C library interface</span> of a Unix-like operating system. The
<a href="low-level-interface.html" data-pltdoc="x">Low-level interface</a> corresponds to the <span style="font-style: italic">system call
interface</span> of a Unix-like operating system.</p><h4>2.1<tt>&nbsp;</tt><a name="(part._hashlang-variations)"></a><a name="(mod-path._marketplace)"></a>Using <span class="stt">#lang marketplace</span> and friends</h4><p><table cellspacing="0" class="defmodule"><tr><td><span class="hspace">&nbsp;</span><a href="http://docs.racket-lang.org/guide/Module_Syntax.html#%28part._hash-lang%29" class="RktModLink" data-pltdoc="x"><span class="RktMod">#lang</span></a><span class="hspace">&nbsp;</span><a href="#%28mod-path._marketplace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr></table></p><p>Programs written for Marketplace differ from normal Racket modules
only in their selection of language. A Racket module written with
<span class="stt">#lang marketplace</span>, such as the echo server in
<a href="Examples.html#%28part._echo-server-example%29" data-pltdoc="x">TCP echo server</a>, specifies a sequence of definitions
and startup <a href="Concepts.html#%28tech._action%29" class="techoutside" data-pltdoc="x"><span class="techinside">actions</span></a> for an application. Typically, initial
actions spawn application processes and nested VMs, which in turn
subscribe to sources of events from the outside world.</p><p>At present, there&rsquo;s just <span class="stt">#lang marketplace</span>. In future, there will
be a variation for Typed Racket, and languages providing greater
support for flow control, responsibility transfer, and other
networking concepts. For now, Typed Racket programs must be written as
<span class="stt">#lang typed/racket</span> programs using <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/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><span class="RktSym">marketplace</span><span class="RktPn">)</span>
and <span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm:</span></span></span> explicitly.</p><h4>2.2<tt>&nbsp;</tt><a name="(part._.Using_.Marketplace_as_a_library)"></a><a name="(mod-path._marketplace/sugar-untyped)"></a><a name="(mod-path._marketplace/sugar-typed)"></a>Using Marketplace as a library</h4><p><table cellspacing="0" class="defmodule"><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/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="#%28mod-path._marketplace%2Fsugar-untyped%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace/sugar-untyped</span></a><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/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="#%28mod-path._marketplace%2Fsugar-typed%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace/sugar-typed</span></a><span class="RktPn">)</span></td></tr></table></p><p>Instead of using Racket&rsquo;s <span class="stt">#lang</span> feature, ordinary Racket programs
can use Marketplace features by requiring Marketplace modules
directly.</p><p>Such programs need to use <span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm</span></span></span>/<span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm:</span></span></span> to
start the ground-level VM explicitly. They also need to explicitly
start any drivers they need; for example, the file
<span class="stt">"examples/echo-plain.rkt"</span> uses <span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm</span></span></span> along with
<span class="RktSym"><span class="badlink"><span class="RktValLink">tcp</span></span></span> and an initial <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span> action:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">tcp</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-listener</span><span class="hspace">&nbsp;</span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:conversation</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">from</span><span class="hspace">&nbsp;</span><span class="RktSym">to</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:on-presence</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">spawn</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:child</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">echoer</span><span class="hspace">&nbsp;</span><span class="RktSym">from</span><span class="hspace">&nbsp;</span><span class="RktSym">to</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><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._marketplace/sugar-untyped..rkt)._ground-vm))"></a><span title="Provided from: marketplace/sugar-untyped, marketplace/sugar-typed"><span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm</span></span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-boot-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">initial-action</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><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._marketplace/sugar-untyped..rkt)._ground-vm~3a))"></a><span title="Provided from: marketplace/sugar-untyped, marketplace/sugar-typed"><span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm:</span></span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-boot-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-typed-initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">initial-action</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" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">maybe-boot-pid-binding</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:boot-pid</span><span class="hspace">&nbsp;</span><span class="RktVar">id</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-initial-state</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-typed-initial-state</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">expr</span><span class="hspace">&nbsp;</span><span class="RktVar">:</span><span class="hspace">&nbsp;</span><span class="RktVar">type</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">initial-action</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">expr</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Starts the ground VM, in untyped and typed programs, respectively. If
<span class="RktPn">#:boot-pid</span> is specified, the given identifier is bound within
the form to the PID of the <span style="font-style: italic">primordial process</span> that performs the
initial actions. If <span class="RktPn">#:initial-state</span> is specified (with a
type, for <span class="RktSym"><span class="badlink"><span class="RktValLink">ground-vm:</span></span></span>), it is used as the initial state for
the primordial process; if it is not supplied, the primordial process
is given <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span> as its initial state (and <span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Void%29%29" class="RktStxLink" data-pltdoc="x">Void</a></span> as
its state type).</div></p><h4>2.3<tt>&nbsp;</tt><a name="(part._constructing-transitions)"></a>Constructing transitions</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">new-state</span><span class="hspace">&nbsp;</span><span class="RktVar">action-tree</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition:</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">new-state</span><span class="hspace">&nbsp;</span><span class="RktVar">:</span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">action-tree</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition/no-state</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">action-tree</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Each of these forms produces a <span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span> structure. The
first is for untyped code, the second for typed code (where the
mandatory <span class="RktVar">State</span> is the type of the transitioning process&rsquo;s
private state), and the third for either.</div></p><p>Each <span class="RktVar">action-tree</span> must be an <span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span><span class="stt"> </span><span class="RktVar">State</span><span class="RktPn">)</span>.</p><p>It&rsquo;s fine to include <span style="font-style: italic">no</span> action-trees, in which case the
transition merely updates the state of the process without taking any
actions.</p><p>In the case of <span class="RktSym"><span class="badlink"><span class="RktValLink">transition/no-state</span></span></span>, the type <span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Void%29%29" class="RktStxLink" data-pltdoc="x">Void</a></span>
and value <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span> is used for the process state.
<span class="RktSym"><span class="badlink"><span class="RktValLink">transition/no-state</span></span></span> is useful for processes that are
stateless other than the implicit state of their endpoints.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>struct</p></div></div><table cellspacing="0" class="RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">state</span><span class="stt"> </span><span class="RktSym">actions</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">#:transparent</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">state</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym">State</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktSym">actions</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>type</p></div></div><p class="RForeground"><span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.All%29%29" class="RktStxLink" data-pltdoc="x">All</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">State</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">A transition structure. The <span class="RktSym"><span class="badlink"><span class="RktValLink">transition-state</span></span></span> field is the new
private state the process will have after the transition is applied,
and the <span class="RktSym"><span class="badlink"><span class="RktValLink">transition-actions</span></span></span> are the actions that will be
performed by the VM in order to apply the transition.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>type</p></div></div><p class="RForeground"><span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.All%29%29" class="RktStxLink" data-pltdoc="x">All</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">State</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Constreeof</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>type</p></div></div><p class="RForeground"><span class="RktSym"><span class="badlink"><span class="RktValLink">Constreeof</span></span></span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.All%29%29" class="RktStxLink" data-pltdoc="x">All</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">X</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.Rec%29%29" class="RktStxLink" data-pltdoc="x">Rec</a></span><span class="hspace">&nbsp;</span><span class="RktSym">CT</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.U%29%29" class="RktStxLink" data-pltdoc="x">U</a></span><span class="hspace">&nbsp;</span><span class="RktSym">X</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Pairof%29%29" class="RktStxLink" data-pltdoc="x">Pairof</a></span><span class="hspace">&nbsp;</span><span class="RktSym">CT</span><span class="hspace">&nbsp;</span><span class="RktSym">CT</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.False%29%29" class="RktStxLink" data-pltdoc="x">False</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Void%29%29" class="RktStxLink" data-pltdoc="x">Void</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Null%29%29" class="RktStxLink" data-pltdoc="x">Null</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">An action-tree is a <a name="(tech._cons._tree)"></a><span style="font-style: italic">cons-tree</span> of <span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span>s. When
performing actions, a VM will traverse an action-tree in left-to-right
order.</div></p><p><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span>, <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span>, and <span class="RktVal">#f</span> may also be present in
action-trees: when the VM reaches such a value, it ignores it and
continues with the next leaf in the tree.</p><p>For example, all of the following are valid action trees which will
send messages <span class="RktVal">1</span>, <span class="RktVal">2</span> and <span class="RktVal">3</span> in that order:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">1</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">2</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">2</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">1</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">2</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">#f</span><span class="hspace">&nbsp;</span><span class="RktVal">#f</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>Because <span class="RktVal">#f</span> and <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span> are valid, ignored, members of
an action-tree, <span class="RktSym"><a href="http://docs.racket-lang.org/reference/if.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._and%29%29" class="RktStxLink" data-pltdoc="x">and</a></span> and <span class="RktSym"><a href="http://docs.racket-lang.org/reference/when_unless.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._when%29%29" class="RktStxLink" data-pltdoc="x">when</a></span> can be used to
selectively include actions in an action-tree:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">first-action</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/when_unless.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._when%29%29" class="RktStxLink" data-pltdoc="x">when</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">condition?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">optional-action</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">final-action</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">first-action</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/if.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._and%29%29" class="RktStxLink" data-pltdoc="x">and</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">condition?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">optional-action</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">final-action</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>Finally, these inert placeholders can be used to represent "no action
at all" in a transition:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">new-state</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">No action-trees at all</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">new-state</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">new-state</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">new-state</span><span class="hspace">&nbsp;</span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr></table></blockquote><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" class="prototype RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">sequence-actions</span></span></span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktVar">initial-transition</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td><td><span class="hspace">&nbsp;</span></td><td><span class="RktVar">item</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></td><td><span class="hspace">&nbsp;</span></td><td>&rarr;</td><td><span class="hspace">&nbsp;</span></td><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">initial-transition</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" class="argcontract"><tr><td><span class="hspace">&nbsp;&nbsp;</span></td><td><span class="RktVar">item</span></td><td><span class="hspace">&nbsp;</span></td><td>:</td><td><span class="hspace">&nbsp;</span></td><td><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.U%29%29" class="RktStxLink" data-pltdoc="x">U</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">State</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-&gt;</span></a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Returns a transition formed from the <span class="RktVar">initial-transition</span>
extended with new actions, possibly updating its carried state. Each
of the supplied <span class="RktVar">item</span>s is examined: if it is an
<span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span>, it is appended to the pending transition&rsquo;s
actions; if it is a procedure, it is called with the <span style="font-style: italic">state</span> of
the pending transition, and is expected to return an updated
transition.</div></p><p>For example,</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">sequence-actions</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">x</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">2</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">old-state</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">y</span><span class="hspace">&nbsp;</span><span class="RktSym">old-state</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">4</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>produces the equivalent of</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">y</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">x</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">2</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">message</span><span class="hspace">&nbsp;</span><span class="RktVal">4</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><h4>2.4<tt>&nbsp;</tt><a name="(part._endpoint-dsl)"></a>Creating endpoints</h4><p>The primitive action that creates new endpoints is
<span class="RktSym"><span class="badlink"><span class="RktValLink">add-endpoint</span></span></span>, but because endpoints are the most flexible and
complex point of interaction between a process and its VM, a DSL,
<span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span>, streamlines endpoint setup.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">orientation</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-interest-type</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-let-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-state-pattern</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-on-presence</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-on-absence</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-role-patterns</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-reason-pattern</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-message-handlers</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint:</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-typed-state-pattern</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">orientation</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-interest-type</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-let-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-on-presence</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-on-absence</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-role-patterns</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-reason-pattern</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-message-handlers</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">maybe-typed-state-pattern</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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="RktVar">pattern</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">orientation</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">#:subscriber</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">#:publisher</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">topic</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">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-interest-type</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:participant</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">#:observer</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">#:everything</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-let-name</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:let-name</span><span class="hspace">&nbsp;</span><span class="RktVar">identifier</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-name</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:name</span><span class="hspace">&nbsp;</span><span class="RktVar">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-state-pattern</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:state</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-on-presence</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:on-presence</span><span class="hspace">&nbsp;</span><span class="RktVar">handler-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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-on-absence</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:on-absence</span><span class="hspace">&nbsp;</span><span class="RktVar">handler-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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-role-patterns</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:role</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</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"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">#:peer-orientation</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span></td></tr><tr><td><span class="RktPn">#:conversation</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span></td></tr><tr><td><span class="RktPn">#:peer-interest-type</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span></td></tr></table></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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-reason-pattern</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:reason</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-message-handlers</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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="RktVar">message-handler</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">message-handler</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">[</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler-expr</span><span class="RktPn">]</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">handler-expr</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">expr</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Almost everything is optional in an <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span>. The only
mandatory parts are the orientation and the topic. For
<span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint:</span></span></span>, the expected type of the process state must also
be supplied.</div></p><p>For example, a minimal endpoint subscribing to all messages would be:</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span></p></blockquote><p>or in Typed Racket, for a process with <span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Integer%29%29" class="RktStxLink" data-pltdoc="x">Integer</a></span> as its process
state type,</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint:</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Integer%29%29" class="RktStxLink" data-pltdoc="x">Integer</a></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span></p></blockquote><p>A minimal publishing endpoint would be:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:publisher</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint:</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Integer%29%29" class="RktStxLink" data-pltdoc="x">Integer</a></span><span class="hspace">&nbsp;</span><span class="RktPn">#:publisher</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span></td></tr></table></blockquote><p>While topic patterns are ordinary Racket data with embedded <span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span>
wildcards (see <a href="Concepts.html#%28part._messages-and-topics%29" data-pltdoc="x">Messages and Topics</a>), all the other patterns
in an <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span> are <span class="RktSym">match</span>-patterns. In particular
note that <span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span> is a wildcard in a topic pattern, while
<span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span> is a wildcard in a <span class="RktSym">match</span>-pattern.</p><h5>2.4.1<tt>&nbsp;</tt><a name="(part._.Receiving_messages)"></a>Receiving messages</h5><p>Supply one or more <span class="RktVar">message-handler</span> clauses to handle incoming
message events (as distinct from presence- or absence-events).</p><p>The following endpoint <span style="font-style: italic">subscribes</span> to all messages, but only
<span style="font-style: italic">handles</span> some of them:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">ping</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pong</span><span class="RktPn">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">hello</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">goodbye</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">quit</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr></table></blockquote><h5>2.4.2<tt>&nbsp;</tt><a name="(part._.Action-only_vs__.State_updates)"></a>Action-only vs. State updates</h5><p>If <span class="RktPn">#:state</span> occurs in an <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span>, or the
<span class="RktVar">maybe-typed-state-pattern</span> occurs in an <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint:</span></span></span>,
then all the <span class="RktVar">handler-expr</span>s in that endpoint are expected to
return <a href="#%28part._constructing-transitions%29" data-pltdoc="x">transition structures</a>.</p><p>If not, however, the event handler expressions are expected to return
plain <span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span>s.</p><p>This way, simple endpoints that do not need to examine the process
state, and simply act in response to whichever event triggered them,
can be written without the clutter of threading the process state
value through the code.</p><p>For example, a simple endpoint could be written either as</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">ping</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pong</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr></table></blockquote><p>or, explicitly accessing the endpoint&rsquo;s process&rsquo;s state,</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:state</span><span class="hspace">&nbsp;</span><span class="RktSym">old-state</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">ping</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">old-state</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pong</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr></table></blockquote><h5>2.4.3<tt>&nbsp;</tt><a name="(part._naming-endpoints)"></a>Naming endpoints</h5><p>Endpoint names can be used to <a href="#%28part._updating-endpoints%29" data-pltdoc="x">update</a>
or <a href="#%28part._deleting-endpoints%29" data-pltdoc="x">delete</a> endpoints.</p><p>If <span class="RktPn">#:name</span> is supplied, the given value is used as the name of
the endpoint. If not, a fresh name is created. (At present,
<span class="RktSym"><a href="http://docs.racket-lang.org/reference/symbols.html#%28def._%28%28quote._~23~25kernel%29._gensym%29%29" class="RktValLink" data-pltdoc="x">gensym</a></span> is used.)</p><p>If <span class="RktPn">#:let-name</span> is supplied, the given identifier is bound in
the <span class="RktVar">handler-expr</span>s to the name of the endpoint. If not, the
name of the endpoint is inaccessible to the <span class="RktVar">handler-expr</span>s.</p><h5>2.4.4<tt>&nbsp;</tt><a name="(part._.Handling_presence_and_absence_events)"></a>Handling presence and absence events</h5><p>Other endpoints (in this or other processes) may have matching topics
and complementary orientations to the current endpoint. When such
endpoints come and go, presence and absence events are generated in
the current endpoint.</p><p>By default, no actions are taken on such events, but
<span class="RktPn">#:on-presence</span> and <span class="RktPn">#:on-absence</span> override this
behaviour.</p><p>For example, say process A establishes the following endpoint:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:on-presence</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pinger-arrived</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:on-absence</span><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pinger-departed</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">ping</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pong</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr></table></blockquote><p>Some time later, process B takes the following endpoint-establishing
action:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:publisher</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:let-name</span><span class="hspace">&nbsp;</span><span class="RktSym">ping-endpoint-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:on-presence</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pong</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:let-name</span><span class="hspace">&nbsp;</span><span class="RktSym">pong-waiter-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">[</span><span class="RktVal">'</span><span class="RktVal">pong</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">delete-endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">ping-endpoint-name</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">delete-endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">pong-waiter-name</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>The sequence of events will be:</p><ol><li><p>Process A&rsquo;s <span class="RktPn">#:on-presence</span> handler will run, and the
<span class="RktVal">'</span><span class="RktVal">pinger-arrived</span> message will be sent. At the same
time,<span class="NoteBox"><span class="NoteContent">In the current implementation, one happens before the
other, but it is nondeterministic which is run first.</span></span> process B&rsquo;s
<span class="RktPn">#:on-presence</span> handler runs, installing a second endpoint
and sending the <span class="RktVal">'</span><span class="RktVal">ping</span> message.</p></li><li><p>Process A&rsquo;s endpoint receives the <span class="RktVal">'</span><span class="RktVal">ping</span> message, and
sends the <span class="RktVal">'</span><span class="RktVal">pong</span> message.</p></li><li><p>Process B&rsquo;s second endpoint receives the <span class="RktVal">'</span><span class="RktVal">pong</span>
message, and deletes both of process B&rsquo;s endpoints.</p></li><li><p>The <span class="RktPn">#:on-absence</span> handler in process A runs, sending
the <span class="RktVal">'</span><span class="RktVal">pinger-departed</span> message.</p></li></ol><p>One possible trace of messages in the VM containing processes A and B is</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktVal">'</span><span class="RktVal">pinger-arrived</span></td></tr><tr><td><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="RktVal">'</span><span class="RktVal">pong</span></td></tr><tr><td><span class="RktVal">'</span><span class="RktVal">pinger-departed</span></td></tr></table></blockquote><p>By sending the <span class="RktVal">'</span><span class="RktVal">ping</span> message <span style="font-style: italic">only</span> once the
<span class="RktPn">#:on-presence</span> handler has fired, process B ensures that
someone is listening for pings.</p><p>This way, if process B starts before process A, then B will
automatically wait until A is ready to receive ping requests before
issuing any.</p><h5>2.4.5<tt>&nbsp;</tt><a name="(part._.Exit_reasons)"></a>Exit reasons</h5><p>If a <span class="RktPn">#:reason</span> pattern is supplied, then the exit reason
supplied to the <span class="RktSym"><span class="badlink"><span class="RktValLink">delete-endpoint</span></span></span> or <span class="RktSym"><span class="badlink"><span class="RktValLink">quit</span></span></span> action that
led to the <span class="RktSym"><span class="badlink"><span class="RktValLink">absence-event</span></span></span> is available to the endpoint&rsquo;s
<span class="RktPn">#:on-absence</span> handler expression.</p><h5>2.4.6<tt>&nbsp;</tt><a name="(part._updating-endpoints)"></a>Updating endpoints</h5><p>If, when an endpoint is created, an existing endpoint with an
<span class="RktSym"><a href="http://docs.racket-lang.org/reference/booleans.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> name is already present, then if the existing and
to-be-added endpoints have exactly equal roles (meaning equal
orientations, interest-types, and topic patterns), the <span style="font-style: italic">handlers</span>
for the endpoint are <span style="font-style: italic">updated</span> without emitting presence or
absence notifications.</p><p>This dubious feature can be used to avoid "glitching" of presence
signals. A future release of this library will include better
automatic support for avoiding such transients.</p><h5>2.4.7<tt>&nbsp;</tt><a name="(part._.Who_am_.I_talking_to_)"></a>Who am I talking to?</h5><p>If either <span class="RktPn">#:role</span> or any of <span class="RktPn">#:peer-orientation</span>,
<span class="RktPn">#:conversation</span>, or <span class="RktPn">#:peer-interest-type</span> are
supplied, the <span class="RktVar">handler-expr</span>s are given access to the role
carried in the <span class="RktSym"><span class="badlink"><span class="RktValLink">EndpointEvent</span></span></span> that triggered them.</p><p>This role describes the <span style="font-style: italic">intersection of interests</span> between the
current endpoint and the peer endpoint, and so can proxy for the
identity of the other party. It is in a sense a description of the
scope of the current conversation.</p><p>Using <span class="RktPn">#:role</span> allows a handler complete access to the
<span class="RktSym"><span class="badlink"><span class="RktValLink">role</span></span></span> structure in the triggering event. It is more common
however to simply use <span class="RktPn">#:conversation</span> to extract the
<span class="RktSym"><span class="badlink"><span class="RktValLink">role-topic</span></span></span> alone, since it is seldom necessary to examine
<span class="RktSym"><span class="badlink"><span class="RktValLink">role-orientation</span></span></span> (since it&rsquo;s guaranteed to be complementary
to the orientation of the current endpoint) or
<span class="RktSym"><span class="badlink"><span class="RktValLink">role-interest-type</span></span></span>. If access to those parts is required, use
<span class="RktPn">#:peer-orientation</span> and <span class="RktPn">#:peer-interest-type</span>.</p><h4>2.5<tt>&nbsp;</tt><a name="(part._deleting-endpoints)"></a>Deleting endpoints</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="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><span class="RktSym"><span class="badlink"><span class="RktValLink">delete-endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span>[<span class="RktVar">reason</span>]<span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Any%29%29" class="RktStxLink" data-pltdoc="x">Any</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">reason</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Any%29%29" class="RktStxLink" data-pltdoc="x">Any</a></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">#f</span></td></tr></table></blockquote></div><div class="SIntrapara">Use this action to delete a previously-added endpoint by name. The
<span class="RktSym">delete-endpoint-id</span> must be <span class="RktSym"><a href="http://docs.racket-lang.org/reference/booleans.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> to the
corresponding <span class="RktSym"><span class="badlink"><span class="RktValLink">add-endpoint-pre-eid</span></span></span>; when <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span>
was used to construct the endpoint to be deleted, the relevant name is
that bound by <span class="RktPn">#:let-name</span> or supplied to <span class="RktPn">#:name</span>. See
<a href="#%28part._naming-endpoints%29" data-pltdoc="x">Naming endpoints</a>.</div></p><p>If <span class="RktVar">reason</span> is supplied, it is included in the corresponding
action, and made available in any resulting <span class="RktSym"><span class="badlink"><span class="RktValLink">absence-event</span></span></span>s.</p><h4>2.6<tt>&nbsp;</tt><a name="(part._.Sending_messages_and_feedback)"></a>Sending messages and feedback</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="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><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span>[<span class="RktVar">orientation</span>]<span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Any%29%29" class="RktStxLink" data-pltdoc="x">Any</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">orientation</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Orientation</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">publisher</span></td></tr></table></blockquote></div><div class="SIntrapara">Constructs a message-sending action with the given orientation.
Usually the correct orientation to use is <span class="RktVal">'</span><span class="RktVal">publisher</span>; it
means that the sender of the message is acting in the "publisher"
role. Use <span class="RktVal">'</span><span class="RktVal">subscriber</span> instead when acting in the "subscriber"
role, i.e. sending feedback.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="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><span class="RktSym"><span class="badlink"><span class="RktValLink">send-feedback</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Any%29%29" class="RktStxLink" data-pltdoc="x">Any</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Equivalent to <span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="stt"> </span><span class="RktVar">body</span><span class="stt"> </span><span class="RktVal">'</span><span class="RktVal">subscriber</span><span class="RktPn">)</span>.</div></p><h4>2.7<tt>&nbsp;</tt><a name="(part._.Creating_processes)"></a>Creating processes</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">spawn</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-debug-name</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-parent-continuation</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:child</span><span class="hspace">&nbsp;</span><span class="RktVar">boot-expr</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">spawn:</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-debug-name</span><span class="hspace">&nbsp;</span><span class="RktVar">typed-parent-continuation</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:child</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">ChildStateType</span><span class="hspace">&nbsp;</span><span class="RktVar">boot-expr</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">maybe-pid-binding</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:pid</span><span class="hspace">&nbsp;</span><span class="RktVar">identifier</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-debug-name</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:debug-name</span><span class="hspace">&nbsp;</span><span class="RktVar">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-parent-continuation</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:parent</span><span class="hspace">&nbsp;</span><span class="RktVar">k-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">#:parent</span><span class="hspace">&nbsp;</span><span class="RktVar">parent-state-pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">k-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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">typed-parent-continuation</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">#:parent</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">ParentStateType</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">#:parent</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">ParentStateType</span><span class="hspace">&nbsp;</span><span class="RktVar">k-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">#:parent</span><span class="hspace">&nbsp;</span><span class="RktVar">parent-state-pattern</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">ParentStateType</span><span class="hspace">&nbsp;</span><span class="RktVar">k-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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">k-expr</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">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">boot-expr</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">expr</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Action describing a new process to create. The <span class="RktVar">boot-expr</span>
should be an expression yielding a <span class="RktSym"><span class="badlink"><span class="RktValLink">transition</span></span></span> that contains
the child process&rsquo;s initial state and initial actions.</div></p><p>If <span class="RktPn">#:pid</span> is supplied, the associated identifier is bound to
the child process&rsquo;s PID in both <span class="RktVar">boot-expr</span> and the parent&rsquo;s
<span class="RktVar">k-expr</span>.</p><p>Any supplied <span class="RktPn">#:debug-name</span> will be used in VM debug output.
See also <a href="Management_and_Monitoring.html#%28part._logging%29" data-pltdoc="x">logging (MATRIX_LOG)</a>.</p><p>If <span class="RktPn">#:parent</span> is supplied, the associated <span class="RktVar">k-expr</span> will
run in the parent process after the child process has been created. If
the <span class="RktVar">parent-state-pattern</span> is also supplied, then
<span class="RktVar">k-expr</span> must return a <span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span>; otherwise, it must
return an <span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span>. Note that in Typed Racket, for type
system reasons, <span class="RktSym"><span class="badlink"><span class="RktValLink">spawn:</span></span></span> requires <span class="RktVar">ParentStateType</span> to
be supplied.</p><h4>2.8<tt>&nbsp;</tt><a name="(part._.Exiting_and_killing_processes)"></a>Exiting and killing processes</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="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><span class="RktSym"><span class="badlink"><span class="RktValLink">quit</span></span></span><span class="hspace">&nbsp;</span>[<span class="RktVar">who</span><span class="hspace">&nbsp;</span><span class="RktVar">reason</span>]<span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">who</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Option%29%29" class="RktStxLink" data-pltdoc="x">Option</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">PID</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">#f</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">reason</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types..rkt%29._.Any%29%29" class="RktStxLink" data-pltdoc="x">Any</a></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">#f</span></td></tr></table></blockquote></div><div class="SIntrapara">Action causing the termination of a process. If <span class="RktVar">who</span> is
omitted or <span class="RktVal">#f</span>, terminates the acting process; otherwise,
terminates the peer process having <span class="RktVar">who</span> as its PID.</div></p><p>If <span class="RktVar">reason</span> is supplied, it is included in the corresponding
action, and made available in any resulting <span class="RktSym"><span class="badlink"><span class="RktValLink">absence-event</span></span></span>s.</p><p>Terminating the current process is as simple as:</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">quit</span></span></span><span class="RktPn">)</span></p></blockquote><p>When a process raises an exception that it does not catch, its
containing VM catches the exception and turns it into an implicit quit
action. In that case, the <span class="RktVar">reason</span> will be the raised exception
itself.</p><h4>2.9<tt>&nbsp;</tt><a name="(part._.Cooperative_scheduling)"></a>Cooperative scheduling</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">yield</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-state-pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">k-expr</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">yield:</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">typed-state-pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">k-expr</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">maybe-state-pattern</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:state</span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">typed-state-pattern</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="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</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="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">k-expr</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">expr</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Lets other processes in the system run for a step, returning to
evaluate <span class="RktVar">k-expr</span> only after doing a complete round of the
scheduler.</div></p><p>If <span class="RktVar">pattern</span> is supplied, <span class="RktVar">k-expr</span> should evaluate to a
<span class="RktSym"><span class="badlink"><span class="RktValLink">Transition</span></span></span>; otherwise it should produce an <span class="RktSym"><span class="badlink"><span class="RktValLink">ActionTree</span></span></span>.</p><h4>2.10<tt>&nbsp;</tt><a name="(part._.Creating_nested_.V.Ms)"></a>Creating nested VMs</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-vm-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-boot-pid-binding</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-initial-state</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-debug-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">boot-action-expr</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm:</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">ParentStateType</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-vm-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-boot-pid-binding</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-typed-initial-state</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">maybe-debug-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVar">boot-action-expr</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="stt">&nbsp;</span></td></tr><tr><td><table cellspacing="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">maybe-vm-pid-binding</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:vm-pid</span><span class="hspace">&nbsp;</span><span class="RktVar">identifier</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-boot-pid-binding</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:boot-pid</span><span class="hspace">&nbsp;</span><span class="RktVar">identifier</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-initial-state</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-typed-initial-state</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:initial-state</span><span class="hspace">&nbsp;</span><span class="RktVar">expr</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">StateType</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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">maybe-debug-name</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"><table cellspacing="0" class="RktBlk"><tr><td></td></tr></table></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">#:debug-name</span><span class="hspace">&nbsp;</span><span class="RktVar">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"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td><td align="left" valign="baseline"><span class="stt">&nbsp;</span></td></tr><tr><td align="right" valign="baseline"><span class="RktVar">boot-action-expr</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">expr</span></td></tr></table></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Results in a <span class="RktSym"><span class="badlink"><span class="RktValLink">spawn</span></span></span> action that starts a nested VM. The
primordial process in the new VM executes the boot-actions with the
given initial state. (If no initial state is supplied, <span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void%29%29" class="RktValLink" data-pltdoc="x">void</a></span><span class="RktPn">)</span>
is used.)</div></p><p>If <span class="RktPn">#:vm-pid</span> is present, the corresponding identifier is bound
in the boot-action expressions to the container-relative PID of the
new VM itself. If <span class="RktPn">#:boot-pid</span> is present, however, the
corresponding identifier is bound to the new-VM-relative PID of the
primordial process in the new VM.</p><h4>2.11<tt>&nbsp;</tt><a name="(part._.Relaying_across_layers)"></a>Relaying across layers</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" class="boxed RBoxed"><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level:</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._~3a%29%29" class="RktStxLink" data-pltdoc="x">:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">StateType</span><span class="hspace">&nbsp;</span><span class="RktVar">preaction</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></td></tr><tr><td><table cellspacing="0" class="together"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">preaction</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">Action</span></span></span><span class="hspace">&nbsp;</span><span class="RktVar">StateType</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">preaction</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">PreAction</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">State</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Each VM gives its processes access to two distinct IPC facilities: the
<span style="font-style: italic">internal</span> one, provided for the VM&rsquo;s processes to talk amongst
themselves, and the <span style="font-style: italic">external</span> one, the network that the VM
itself is a process within.</div></p><p>Marketplace&rsquo;s actions can apply to either of those two networks. By
default, actions apply to the VM of the acting process directly, but
using <span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level</span></span></span> (or <span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level:</span></span></span> in typed
code) to wrap an action <span style="font-style: italic">level-shifts</span> the action to make it
apply at the level of the acting process&rsquo;s VM&rsquo;s container instead.</p><p>For example, wrapping an <span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span> in <span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level</span></span></span>
adds a subscription to the VM&rsquo;s container&rsquo;s network. Instead of
listening to sibling processes of the acting process, the new endpoint
will listen to sibling processes of the acting process&rsquo;s VM. In this
example, the primordial process in the <span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span> creates an
endpoint in the VM&rsquo;s own network, the ground VM:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">endpoint</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:subscriber</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-listener</span><span class="hspace">&nbsp;</span><span class="RktVal">5999</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>In this example, a new process is spawned as a sibling of the
<span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span> rather than as a sibling of its primordial process:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">at-meta-level</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">spawn</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:child</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition/no-state</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">hello-world</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>Compare to this example, which spawns a sibling of the
<span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span>&rsquo;s primordial process:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">nested-vm</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">spawn</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:child</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">transition/no-state</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">send-message</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">hello-world</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><div class="navsetbottom"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="Concepts.html" title="backward to &quot;1 Concepts&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="low-level-interface.html" title="forward to &quot;3 Low-level interface&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>