marketplace-2014/high-level-interface.html

192 lines
180 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="manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-racket.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 tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_0&quot;);">&#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="high-level-interface.html" 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="high-level-interface.html" 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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="high-level-interface.html#%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="#%28part._hashlang-variations%29" 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="#%28part._.Using_.Marketplace_as_a_library%29" class="tocsubseclink" data-pltdoc="x">Using Marketplace as a library</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">ground-<wbr></wbr>vm</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._ground-vm~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">ground-<wbr></wbr>vm:</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.3<tt>&nbsp;</tt></span><a href="#%28part._constructing-transitions%29" class="tocsubseclink" data-pltdoc="x">Constructing transitions</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">transition</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">transition:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">transition/<span class="mywbr"> &nbsp;</span>no-<wbr></wbr>state</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">transition</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">Transition</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">Action<span class="mywbr"> &nbsp;</span>Tree</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Constreeof%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">Constreeof</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._sequence-actions%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">sequence-<wbr></wbr>actions</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4<tt>&nbsp;</tt></span><a href="#%28part._endpoint-dsl%29" class="tocsubseclink" data-pltdoc="x">Creating endpoints</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">publisher</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._publisher~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">publisher:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">subscriber</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._subscriber~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">subscriber:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>subscribers</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-subscribers~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>subscribers:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>publishers</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-publishers~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>publishers:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%2Feverything%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>subscribers/<span class="mywbr"> &nbsp;</span>everything</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-subscribers%2Feverything~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>subscribers/<span class="mywbr"> &nbsp;</span>everything:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%2Feverything%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>publishers/<span class="mywbr"> &nbsp;</span>everything</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-publishers%2Feverything~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">observe-<wbr></wbr>publishers/<span class="mywbr"> &nbsp;</span>everything:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._build-endpoint%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">build-<wbr></wbr>endpoint</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._build-endpoint~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">build-<wbr></wbr>endpoint:</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.1<tt>&nbsp;</tt></span><a href="#%28part._.Receiving_messages%29" class="tocsubseclink" data-pltdoc="x">Receiving messages</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">on-<wbr></wbr>message</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.2<tt>&nbsp;</tt></span><a href="#%28part._.Action-only_vs__.State_updates%29" class="tocsubseclink" data-pltdoc="x">Action-<wbr></wbr>only vs. State updates</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-state%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">match-<wbr></wbr>state</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.3<tt>&nbsp;</tt></span><a href="#%28part._.Handling_presence_and_absence_events%29" class="tocsubseclink" data-pltdoc="x">Handling presence and absence events</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">on-<wbr></wbr>presence</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">on-<wbr></wbr>absence</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.4<tt>&nbsp;</tt></span><a href="#%28part._.Exit_reasons%29" class="tocsubseclink" data-pltdoc="x">Exit reasons</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-reason%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">match-<wbr></wbr>reason</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.5<tt>&nbsp;</tt></span><a href="#%28part._updating-endpoints%29" class="tocsubseclink" data-pltdoc="x">Updating endpoints</a></td></tr><tr><td><span class="tocsublinknumber">2.4.6<tt>&nbsp;</tt></span><a href="#%28part._.Who_am_.I_talking_to_%29" class="tocsubseclink" data-pltdoc="x">Who am I talking to?</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-orientation%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">match-<wbr></wbr>orientation</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">match-<wbr></wbr>conversation</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-interest-type%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">match-<wbr></wbr>interest-<wbr></wbr>type</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.4.7<tt>&nbsp;</tt></span><a href="#%28part._participating-vs-observing%29" class="tocsubseclink" data-pltdoc="x">Participating in a conversation vs. observing conversations</a></td></tr><tr><td><span class="tocsublinknumber">2.4.8<tt>&nbsp;</tt></span><a href="#%28part._naming-endpoints%29" class="tocsubseclink" data-pltdoc="x">Naming endpoints</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-endpoint%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">name-<wbr></wbr>endpoint</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._let-fresh%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">let-<wbr></wbr>fresh</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.5<tt>&nbsp;</tt></span><a href="#%28part._deleting-endpoints%29" class="tocsubseclink" data-pltdoc="x">Deleting endpoints</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">delete-<wbr></wbr>endpoint</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.6<tt>&nbsp;</tt></span><a href="#%28part._.Sending_messages_and_feedback%29" class="tocsubseclink" data-pltdoc="x">Sending messages and feedback</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">send-<wbr></wbr>message</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-feedback%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">send-<wbr></wbr>feedback</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.7<tt>&nbsp;</tt></span><a href="#%28part._.Creating_processes%29" class="tocsubseclink" data-pltdoc="x">Creating processes</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%2Fcontinue%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn/<span class="mywbr"> &nbsp;</span>continue</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn:</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn%2Fcontinue~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn/<span class="mywbr"> &nbsp;</span>continue:</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-process%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">name-<wbr></wbr>process</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.8<tt>&nbsp;</tt></span><a href="#%28part._.Exiting_and_killing_processes%29" class="tocsubseclink" data-pltdoc="x">Exiting and killing processes</a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">quit</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.9<tt>&nbsp;</tt></span><a href="#%28part._.Cooperative_scheduling%29" class="tocsubseclink" data-pltdoc="x">Cooperative scheduling</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._yield%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">yield</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._yield~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">yield:</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.10<tt>&nbsp;</tt></span><a href="#%28part._.Creating_nested_.V.Ms%29" class="tocsubseclink" data-pltdoc="x">Creating nested VMs</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn-vm%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn-<wbr></wbr>vm</span></span></a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn-vm~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">spawn-<wbr></wbr>vm:</span></span></a></td></tr><tr><td><span class="tocsublinknumber">2.11<tt>&nbsp;</tt></span><a href="#%28part._.Relaying_across_layers%29" class="tocsubseclink" data-pltdoc="x">Relaying across layers</a></td></tr><tr><td><a href="#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._at-meta-level~3a%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">at-<wbr></wbr>meta-<wbr></wbr>level:</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">at-<wbr></wbr>meta-<wbr></wbr>level</span></span></a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="version">6.0.0.1</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 align="left"><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="high-level-interface.html#%28mod-path._marketplace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <span class="stt">marketplace</span></span></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._ground-vm~3a%29%29" class="RktStxLink" data-pltdoc="x">ground-vm:</a></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 align="left" colspan="2"><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="high-level-interface.html#%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 align="left" colspan="2"><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="high-level-interface.html#%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><tr><td align="left">&nbsp;</td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <span class="stt">marketplace</span></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="RktStxLink" data-pltdoc="x">ground-vm</a></span>/<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._ground-vm~3a%29%29" class="RktStxLink" data-pltdoc="x">ground-vm:</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="RktStxLink" data-pltdoc="x">ground-vm</a></span> along with
<span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp%29%29" class="RktValLink" data-pltdoc="x">tcp</a></span> and an initial <span class="RktSym">endpoint</span> action:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="RktStxLink" data-pltdoc="x">ground-vm</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="Drivers.html#%28def._%28%28lib._marketplace%2Fdrivers%2Ftcp-bare..rkt%29._tcp%29%29" class="RktValLink" data-pltdoc="x">tcp</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" 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;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxLink" data-pltdoc="x">match-conversation</a></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;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></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><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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._ground-vm%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">ground-vm</a></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-typed..rkt)._ground-vm~3a))"></a><span title="Provided from: marketplace/sugar-untyped, marketplace/sugar-typed"><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._ground-vm~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">ground-vm:</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._ground-vm~3a%29%29" class="RktStxLink" data-pltdoc="x">ground-vm:</a></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><a name="(form._((lib._marketplace/sugar-values..rkt)._transition))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">transition</a></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><a name="(form._((lib._marketplace/sugar-typed..rkt)._transition~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">transition:</a></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><a name="(form._((lib._marketplace/sugar-typed..rkt)._transition/no-state))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">transition/no-state</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValLink" data-pltdoc="x">ActionTree</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></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><a name="(def._((lib._marketplace/main..rkt)._transition-actions))"></a><a name="(def._((lib._marketplace/main..rkt)._transition-state))"></a><a name="(def._((lib._marketplace/main..rkt)._transition~3f))"></a><a name="(def._((lib._marketplace/main..rkt)._struct~3atransition))"></a><a name="(def._((lib._marketplace/sugar-values..rkt)._transition))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValLink" data-pltdoc="x">ActionTree</a></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"><a name="(def._((lib._marketplace/main..rkt)._.Transition))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValDef RktValLink" data-pltdoc="x">Transition</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._transition-state%29%29" class="RktValLink" data-pltdoc="x">transition-state</a></span> field is the new
private state the process will have after the transition is applied,
and the <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._transition-actions%29%29" class="RktValLink" data-pltdoc="x">transition-actions</a></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"><a name="(def._((lib._marketplace/main..rkt)._.Action.Tree))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValDef RktValLink" data-pltdoc="x">ActionTree</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Constreeof%29%29" class="RktValLink" data-pltdoc="x">Constreeof</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a name="(def._((lib._marketplace/main..rkt)._.Constreeof))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Constreeof%29%29" class="RktValDef RktValLink" data-pltdoc="x">Constreeof</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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><a name="(def._((lib._marketplace/sugar-values..rkt)._sequence-actions))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._sequence-actions%29%29" class="RktValDef RktValLink" data-pltdoc="x">sequence-actions</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValLink" data-pltdoc="x">ActionTree</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValLink" data-pltdoc="x">ActionTree</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._sequence-actions%29%29" class="RktValLink" data-pltdoc="x">sequence-actions</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</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="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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._add-endpoint%29%29" class="RktValLink" data-pltdoc="x">add-endpoint</a></span>, but because endpoints are the most flexible and
complex point of interaction between a process and its VM, a
collection of macros helps streamline 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><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._publisher))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">publisher</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._publisher~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._publisher~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">publisher:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._subscriber))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._subscriber~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._subscriber~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">subscriber:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._observe-subscribers))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-subscribers</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._observe-subscribers~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-subscribers~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-subscribers:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._observe-publishers))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-publishers</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._observe-publishers~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-publishers~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-publishers:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._observe-subscribers/everything))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%2Feverything%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-subscribers/everything</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._observe-subscribers/everything~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-subscribers%2Feverything~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-subscribers/everything:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._observe-publishers/everything))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%2Feverything%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-publishers/everything</a></span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._observe-publishers/everything~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._observe-publishers%2Feverything~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">observe-publishers/everything:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">topic</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._build-endpoint))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._build-endpoint%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">build-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pre-eid</span><span class="hspace">&nbsp;</span><span class="RktVar">role</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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-typed..rkt)._build-endpoint~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._build-endpoint~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">build-endpoint:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">State</span><span class="hspace">&nbsp;</span><span class="RktVar">pre-eid</span><span class="hspace">&nbsp;</span><span class="RktVar">role</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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">The many variations on the core
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._build-endpoint%29%29" class="RktStxLink" data-pltdoc="x">build-endpoint</a></span>/<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._build-endpoint~3a%29%29" class="RktStxLink" data-pltdoc="x">build-endpoint:</a></span> form exist to give
good control over <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Interest.Type%29%29" class="RktValLink" data-pltdoc="x">InterestType</a></span> in the endpoint under
construction;
see <a href="high-level-interface.html#%28part._participating-vs-observing%29" data-pltdoc="x">Participating in a conversation vs. observing conversations</a>.</div></p><p>Almost everything is optional in an endpoint definition. The only
mandatory part is the topic, unless you&rsquo;re using Typed Racket, in
which case the process state type must also be specified.</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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._subscriber~3a%29%29" class="RktStxLink" data-pltdoc="x">subscriber:</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="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._publisher~3a%29%29" class="RktStxLink" data-pltdoc="x">publisher:</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="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></td></tr></table></blockquote><p>While topic patterns are ordinary Racket data with embedded <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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 endpoint definition are <span class="RktSym">match</span>-patterns. In particular
note that <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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><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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._on-message))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&nbsp;</span><span class="RktPn">[</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">expr</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">]</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Supply an <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span> handler clause to an endpoint definition
to handle incoming message events (as distinct from presence- or
absence-events).</div></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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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;</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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="RktValLink" data-pltdoc="x">quit</a></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><h5>2.4.2<tt>&nbsp;</tt><a name="(part._.Action-only_vs__.State_updates)"></a>Action-only vs. State updates</h5><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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._match-state))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-state%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">match-state</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">If a group of handlers is wrapped in <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-state%29%29" class="RktStxLink" data-pltdoc="x">match-state</a></span>, then all
the wrapped handlers are expected to return
<a href="high-level-interface.html#%28part._constructing-transitions%29" data-pltdoc="x">transition structures</a>.</div></p><p>If not, however, the handler expressions are expected to return plain
<span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action.Tree%29%29" class="RktValLink" data-pltdoc="x">ActionTree</a></span>s.</p><p>This way, simple handlers 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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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><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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-state%29%29" class="RktStxLink" data-pltdoc="x">match-state</a></span><span class="hspace">&nbsp;</span><span class="RktSym">old-state</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><h5>2.4.3<tt>&nbsp;</tt><a name="(part._.Handling_presence_and_absence_events)"></a>Handling presence and absence events</h5><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)._on-presence))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">on-presence</a></span><span class="hspace">&nbsp;</span><span class="RktVar">expr</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)._on-absence))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">on-absence</a></span><span class="hspace">&nbsp;</span><span class="RktVar">expr</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">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.</div></p><p>By default, no actions are taken on such events, but
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></span> and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</a></span> handlers 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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ping</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pinger-arrived</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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</a></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">pinger-departed</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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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><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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._let-fresh%29%29" class="RktStxLink" data-pltdoc="x">let-fresh</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">ping-endpoint-name</span><span class="hspace">&nbsp;</span><span class="RktSym">pong-waiter-name</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-endpoint%29%29" class="RktValLink" data-pltdoc="x">name-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktSym">ping-endpoint-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</a></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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></span></td></tr><tr><td><span class="hspace">&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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-endpoint%29%29" class="RktValLink" data-pltdoc="x">name-endpoint</a></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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></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><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;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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><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="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></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="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></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="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</a></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="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-presence%29%29" class="RktStxLink" data-pltdoc="x">on-presence</a></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.4<tt>&nbsp;</tt><a name="(part._.Exit_reasons)"></a>Exit reasons</h5><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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._match-reason))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-reason%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">match-reason</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">If a handler is wrapped in a <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-reason%29%29" class="RktStxLink" data-pltdoc="x">match-reason</a></span> form, then the exit
reason supplied to the <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></span> or <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="RktValLink" data-pltdoc="x">quit</a></span>
action that led to the <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._absence-event%29%29" class="RktValLink" data-pltdoc="x">absence-event</a></span> is available to the
endpoint&rsquo;s <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</a></span> handler expression.</div></p><h5>2.4.5<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.6<tt>&nbsp;</tt><a name="(part._.Who_am_.I_talking_to_)"></a>Who am I talking to?</h5><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)._match-orientation))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-orientation%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">match-orientation</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._match-conversation))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">match-conversation</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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)._match-interest-type))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-interest-type%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">match-interest-type</a></span><span class="hspace">&nbsp;</span><span class="RktVar">pattern</span><span class="hspace">&nbsp;</span><span class="RktVar">handler</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">Wrapping a handler in <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-orientation%29%29" class="RktStxLink" data-pltdoc="x">match-orientation</a></span>,
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxLink" data-pltdoc="x">match-conversation</a></span>, and/or <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-interest-type%29%29" class="RktStxLink" data-pltdoc="x">match-interest-type</a></span> gives
a handler access to the contents of the <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._role%29%29" class="RktValLink" data-pltdoc="x">role</a></span> structure
carried in the triggering <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Endpoint.Event%29%29" class="RktValLink" data-pltdoc="x">EndpointEvent</a></span>.</div></p><p>The carried 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>It is most common to simply use <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxLink" data-pltdoc="x">match-conversation</a></span> to extract
the <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._role-topic%29%29" class="RktValLink" data-pltdoc="x">role-topic</a></span> alone, since it is seldom necessary to examine
<span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._role-orientation%29%29" class="RktValLink" data-pltdoc="x">role-orientation</a></span> (since it&rsquo;s guaranteed to be complementary
to the orientation of the current endpoint) or
<span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._role-interest-type%29%29" class="RktValLink" data-pltdoc="x">role-interest-type</a></span>.</p><p>See <a href="Examples.html" data-pltdoc="x">Examples</a> for examples of the use of
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._match-conversation%29%29" class="RktStxLink" data-pltdoc="x">match-conversation</a></span> and friends.</p><h5>2.4.7<tt>&nbsp;</tt><a name="(part._participating-vs-observing)"></a>Participating in a conversation vs. observing conversations</h5><p>The core <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._build-endpoint%29%29" class="RktStxLink" data-pltdoc="x">build-endpoint</a></span> form takes an expression evaluating
to a <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._role%29%29" class="RktValLink" data-pltdoc="x">role</a></span>, rather than a simple topic. This gives full
control over the new endpoint&rsquo;s <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Orientation%29%29" class="RktValLink" data-pltdoc="x">Orientation</a></span> and
<span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Interest.Type%29%29" class="RktValLink" data-pltdoc="x">InterestType</a></span>.</p><p>The other forms exist for convenience, since usually the orientation
and interest-type is known statically, and only the topic varies
dynamically:</p><ul><li><p><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</a></span> and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span> (and typed
variations ending in <span class="stt">:</span>) are for ordinary <span style="font-style: italic">participation</span> in
conversations;</p></li><li><p><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%29%29" class="RktStxLink" data-pltdoc="x">observe-subscribers</a></span> and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers</a></span>
are for <span style="font-style: italic">observing</span> conversations without participating in them; and</p></li><li><p><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%2Feverything%29%29" class="RktStxLink" data-pltdoc="x">observe-subscribers/everything</a></span> and
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%2Feverything%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers/everything</a></span> are like the ordinary
<span class="stt">observe-...</span> variants, but use interest-type <span class="RktVal">'</span><span class="RktVal">everything</span>
instead of <span class="RktVal">'</span><span class="RktVal">observer</span>.</p></li></ul><p>The <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</a></span>, <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%29%29" class="RktStxLink" data-pltdoc="x">observe-subscribers</a></span> and
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-subscribers%2Feverything%29%29" class="RktStxLink" data-pltdoc="x">observe-subscribers/everything</a></span> forms create
<span style="font-style: italic">publisher</span>-oriented endpoints, and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span>,
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers</a></span> and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._observe-publishers%2Feverything%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers/everything</a></span>
create <span style="font-style: italic">subscriber</span>-oriented endpoints. The rationale for this is
that as a participant, the code should declare the role being played;
but as an observer, the code should declare the roles being observed.</p><h5>2.4.8<tt>&nbsp;</tt><a name="(part._naming-endpoints)"></a>Naming endpoints</h5><p>Endpoint names can be used to <a href="high-level-interface.html#%28part._updating-endpoints%29" data-pltdoc="x">update</a>
or <a href="high-level-interface.html#%28part._deleting-endpoints%29" data-pltdoc="x">delete</a> endpoints.</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><a name="(def._((lib._marketplace/sugar-typed..rkt)._name-endpoint))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-endpoint%29%29" class="RktValDef RktValLink" data-pltdoc="x">name-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span><span class="RktVar">add-endpoint-action</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Add.Endpoint%29%29" class="RktValLink" data-pltdoc="x">AddEndpoint</a></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">add-endpoint-action</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Add.Endpoint%29%29" class="RktValLink" data-pltdoc="x">AddEndpoint</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns a copy of the passed-in <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._add-endpoint%29%29" class="RktValLink" data-pltdoc="x">add-endpoint</a></span> action
structure, with the <span class="RktVar">id</span> field set to the passed-in identifying
value.</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>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._let-fresh))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._let-fresh%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">let-fresh</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktVar">identifier</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVar">expr</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Binds the <span class="RktVar">identifier</span>s to freshly-gensymmed symbols so that
they are available to the <span class="RktSym">exprs</span>. <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._let-fresh%29%29" class="RktStxLink" data-pltdoc="x">let-fresh</a></span> is useful
for inventing a guaranteed-unused name for a temporary endpoint:</div></p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._let-fresh%29%29" class="RktStxLink" data-pltdoc="x">let-fresh</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">my-name</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-endpoint%29%29" class="RktValLink" data-pltdoc="x">name-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktSym">my-name</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span><span class="hspace">&nbsp;</span><span class="RktPn">[</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="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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktSym">my-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;</span><span class="RktMeta"><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><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><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><a name="(def._((lib._marketplace/sugar-values..rkt)._delete-endpoint))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValDef RktValLink" data-pltdoc="x">delete-endpoint</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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="RktVar">id</span> given 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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._add-endpoint-pre-eid%29%29" class="RktValLink" data-pltdoc="x">add-endpoint-pre-eid</a></span>; when <span class="RktSym">endpoint</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="high-level-interface.html#%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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._absence-event%29%29" class="RktValLink" data-pltdoc="x">absence-event</a></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><a name="(def._((lib._marketplace/sugar-values..rkt)._send-message))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValDef RktValLink" data-pltdoc="x">send-message</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Orientation%29%29" class="RktValLink" data-pltdoc="x">Orientation</a></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><a name="(def._((lib._marketplace/sugar-values..rkt)._send-feedback))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-feedback%29%29" class="RktValDef RktValLink" data-pltdoc="x">send-feedback</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._spawn))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn</a></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</span><span class="hspace">&nbsp;</span><span class="RktVar">boot-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><table cellspacing="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><a name="(form._((lib._marketplace/sugar-untyped..rkt)._spawn/continue))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%2Fcontinue%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn/continue</a></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</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">#: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><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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><a name="(form._((lib._marketplace/sugar-typed..rkt)._spawn~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><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><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></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><a name="(form._((lib._marketplace/sugar-typed..rkt)._spawn/continue~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn%2Fcontinue~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn/continue:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">maybe-pid-binding</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;</span><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><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-values..rkt%29._transition%29%29" class="RktStxLink" data-pltdoc="x">transition</a></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>The <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%2Fcontinue%29%29" class="RktStxLink" data-pltdoc="x">spawn/continue</a></span> and <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn%2Fcontinue~3a%29%29" class="RktStxLink" data-pltdoc="x">spawn/continue:</a></span> variations
include a <span class="RktVar">k-expr</span>, which will run in the parent process after
the child process has been created. Note that <span class="RktVar">k-expr</span> must
return a <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></span>, since <span class="RktVar">parent-state-pattern</span> is
always supplied for these variations.</p><p>In Typed Racket, for type system reasons, <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn~3a%29%29" class="RktStxLink" data-pltdoc="x">spawn:</a></span> and
<span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn%2Fcontinue~3a%29%29" class="RktStxLink" data-pltdoc="x">spawn/continue:</a></span> require <span class="RktVar">ParentStateType</span> to be
supplied as well as <span class="RktVar">ChildStateType</span>.</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><a name="(def._((lib._marketplace/sugar-typed..rkt)._name-process))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-process%29%29" class="RktValDef RktValLink" data-pltdoc="x">name-process</a></span><span class="hspace">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span><span class="RktVar">spawn-action</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Spawn%29%29" class="RktValLink" data-pltdoc="x">Spawn</a></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">spawn-action</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Spawn%29%29" class="RktValLink" data-pltdoc="x">Spawn</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns a copy of the passed-in <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span> action structure, with
the <span class="RktSym">debug-name</span> field set to the passed-in identifying value.
The debug name of a process is used in VM debug output. See also
<a href="Management_and_Monitoring.html#%28part._logging%29" data-pltdoc="x">logging (MARKETPLACE_LOG)</a>.</div></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><a name="(def._((lib._marketplace/sugar-values..rkt)._quit))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="RktValDef RktValLink" data-pltdoc="x">quit</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.P.I.D%29%29" class="RktValLink" data-pltdoc="x">PID</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._absence-event%29%29" class="RktValLink" data-pltdoc="x">absence-event</a></span>s.</p><p>Terminating the current process is as simple as:</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._quit%29%29" class="RktValLink" data-pltdoc="x">quit</a></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><a name="(form._((lib._marketplace/sugar-untyped..rkt)._yield))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._yield%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">yield</a></span><span class="hspace">&nbsp;</span><span class="RktVar">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><a name="(form._((lib._marketplace/sugar-typed..rkt)._yield~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._yield~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">yield:</a></span><span class="hspace">&nbsp;</span><span class="RktVar">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><span class="hspace">&nbsp;</span><span class="RktVar">k-expr</span><span class="RktPn">)</span></p></blockquote></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>The state of the yielding process will be matched against
<span class="RktVar">state-pattern</span> when the process is resumed, and
<span class="RktVar">k-expr</span> must evaluate to a <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></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><a name="(form._((lib._marketplace/sugar-untyped..rkt)._spawn-vm))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn-vm%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn-vm</a></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;</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;</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;</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><a name="(form._((lib._marketplace/sugar-typed..rkt)._spawn-vm~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._spawn-vm~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">spawn-vm:</a></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;</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-typed-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><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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></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><a name="(form._((lib._marketplace/sugar-typed..rkt)._at-meta-level~3a))"></a><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._at-meta-level~3a%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">at-meta-level:</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><a name="(def._((lib._marketplace/sugar-untyped..rkt)._at-meta-level))"></a><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValDef RktValLink" data-pltdoc="x">at-meta-level</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Action%29%29" class="RktValLink" data-pltdoc="x">Action</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Pre.Action%29%29" class="RktValLink" data-pltdoc="x">PreAction</a></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"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValLink" data-pltdoc="x">at-meta-level</a></span> (or <span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._at-meta-level~3a%29%29" class="RktStxLink" data-pltdoc="x">at-meta-level:</a></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">endpoint</span> in <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValLink" data-pltdoc="x">at-meta-level</a></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 nested VM 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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn-vm%29%29" class="RktStxLink" data-pltdoc="x">spawn-vm</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValLink" data-pltdoc="x">at-meta-level</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._subscriber%29%29" class="RktStxLink" data-pltdoc="x">subscriber</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></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
nested VM 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"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn-vm%29%29" class="RktStxLink" data-pltdoc="x">spawn-vm</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._at-meta-level%29%29" class="RktValLink" data-pltdoc="x">at-meta-level</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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
nested VM&rsquo;s primordial process:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn-vm%29%29" class="RktStxLink" data-pltdoc="x">spawn-vm</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._spawn%29%29" class="RktStxLink" data-pltdoc="x">spawn</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28form._%28%28lib._marketplace%2Fsugar-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></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>