marketplace-2014/Examples.html

17 lines
61 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>6&nbsp;Examples</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="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="tocviewlink" 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="tocviewselflink" 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>6&nbsp;</td><td><a href="Examples.html" class="tocviewselflink" data-pltdoc="x">Examples</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">6.1&nbsp;</td><td><a href="Examples.html#%28part._echo-server-example%29" class="tocviewlink" data-pltdoc="x">TCP echo server</a></td></tr><tr><td align="right">6.2&nbsp;</td><td><a href="Examples.html#%28part._chat-server-example%29" class="tocviewlink" data-pltdoc="x">TCP chat server</a></td></tr><tr><td align="right">6.3&nbsp;</td><td><a href="Examples.html#%28part._chat-client-example%29" class="tocviewlink" data-pltdoc="x">TCP chat client</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">6.1<tt>&nbsp;</tt></span><a href="#%28part._echo-server-example%29" class="tocsubseclink" data-pltdoc="x">TCP echo server</a></td></tr><tr><td><span class="tocsublinknumber">6.2<tt>&nbsp;</tt></span><a href="#%28part._chat-server-example%29" class="tocsubseclink" data-pltdoc="x">TCP chat server</a></td></tr><tr><td><span class="tocsublinknumber">6.3<tt>&nbsp;</tt></span><a href="#%28part._chat-client-example%29" class="tocsubseclink" data-pltdoc="x">TCP chat client</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="Management_and_Monitoring.html" title="backward to &quot;5 Management and Monitoring&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;<span class="nonavigation">next &rarr;</span></span>&nbsp;</div><h3>6<tt>&nbsp;</tt><a name="(part._.Examples)"></a>Examples</h3><h4>6.1<tt>&nbsp;</tt><a name="(part._echo-server-example)"></a>TCP echo server</h4><p>Here is a complete Marketplace program:</p><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/echo-paper.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><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="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><span class="RktPn">(</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><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="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="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></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</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></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">stateless</span></td></tr><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="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">to</span><span class="hspace">&nbsp;</span><span class="RktSym">from</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="RktPn">)</span></td></tr><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="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="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-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</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._quit%29%29" class="RktValLink" data-pltdoc="x">quit</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-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</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="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="hspace">&nbsp;</span><span class="RktSym">data</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">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">to</span><span class="hspace">&nbsp;</span><span class="RktSym">from</span><span class="hspace">&nbsp;</span><span class="RktSym">data</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><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><p>The top-level <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> monitors TCP connections
arriving on port 5999 and <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>s a fresh process in response
to each with the help of the auxiliary <span class="RktSym">echoer</span> function. The
topic of conversation associated with the each new connection is
parsed (with <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 name the remote
(<span class="RktSym">from</span>) and local (<span class="RktSym">to</span>) TCP addresses, which are
passed to <span class="RktSym">echoer</span> to create the initial state and actions for
the corresponding process. In this case, the process is stateless,
indicated by the special constant <span class="RktSym">stateless</span>.</p><p>Each connection&rsquo;s process watches for incoming data, using
<span class="RktSym">from</span> and <span class="RktSym">to</span> to configure a <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>. It
also declares its intent to produce outbound TCP data, using
<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>. When data arrives, it is echoed back to the remote
peer using the <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> operation. Absence notifications
signal disconnection; when the remote peer closes the TCP connection,
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 issues a <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, which
terminates the connection&rsquo;s process.</p><h4>6.2<tt>&nbsp;</tt><a name="(part._chat-server-example)"></a>TCP chat server</h4><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/chat-paper.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><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="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><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._observe-publishers%29%29" class="RktStxLink" data-pltdoc="x">observe-publishers</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="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">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</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="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">chat-session</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</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><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">chat-session</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/symbols.html#%28def._%28%28quote._~23~25kernel%29._gensym%29%29" class="RktValLink" data-pltdoc="x">gensym</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">user</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">stateless</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">listen-to-user</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">speak-to-user</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">listen-to-user</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><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></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">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</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-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</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._quit%29%29" class="RktValLink" data-pltdoc="x">quit</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-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</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="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="hspace">&nbsp;</span><span class="RktPn">(</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="RktSym"><a href="http://docs.racket-lang.org/reference/bytestrings.html#%28def._%28%28quote._~23~25kernel%29._bytes~3f%29%29" class="RktValLink" data-pltdoc="x">bytes?</a></span><span class="hspace">&nbsp;</span><span class="RktSym">text</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="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktVal">says</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</span><span class="RktSym">text</span><span class="RktVal">)</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="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">(</span><span class="RktRdr">,</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktVal">says</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</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="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">speak-to-user</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="RktPn">)</span></td></tr><tr><td><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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace">&nbsp;</span><span class="RktSym">fmt</span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym">args</span><span class="RktPn">)</span></td></tr><tr><td><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;</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></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">us</span><span class="hspace">&nbsp;</span><span class="RktSym">them</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/procedures.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._apply%29%29" class="RktValLink" data-pltdoc="x">apply</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace">&nbsp;</span><span class="RktSym">fmt</span><span class="hspace">&nbsp;</span><span class="RktSym">args</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="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._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">announce</span><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktSym">did-what</span><span class="RktPn">)</span></td></tr><tr><td><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._unless%29%29" class="RktStxLink" data-pltdoc="x">unless</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><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><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace">&nbsp;</span><span class="RktVal">"~s ~s.~n"</span><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktSym">did-what</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><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></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">say</span><span class="hspace">&nbsp;</span><span class="RktVal">"You are ~s.~n"</span><span class="hspace">&nbsp;</span><span class="RktSym">user</span><span class="RktPn">)</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._publisher%29%29" class="RktStxLink" data-pltdoc="x">publisher</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">us</span><span class="hspace">&nbsp;</span><span class="RktSym">them</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="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-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">(</span><span class="RktRdr">,</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="RktVal">says</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</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="RktVal">)</span></td></tr><tr><td><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="RktVal">`</span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktVal">says</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</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="RktVal">)</span></td></tr><tr><td><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">announce</span><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">arrived</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-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">announce</span><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">departed</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-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">(</span><span class="RktRdr">,</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktVal">says</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</span><span class="RktSym">what</span><span class="RktVal">)</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">say</span><span class="hspace">&nbsp;</span><span class="RktVal">"~a: ~a"</span><span class="hspace">&nbsp;</span><span class="RktSym">who</span><span class="hspace">&nbsp;</span><span class="RktSym">what</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><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><h4>6.3<tt>&nbsp;</tt><a name="(part._chat-client-example)"></a>TCP chat client</h4><blockquote class="SCodeFlow"><blockquote class="Rfilebox"><p class="Rfiletitle"><span class="Rfilename"><span class="stt">"examples/chat-client.rkt"</span></span></p><blockquote class="Rfilecontent"><table cellspacing="0" class="RktBlk"><tr><td><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="low-level-interface.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">marketplace</span></a></td></tr><tr><td><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="hspace">&nbsp;</span><span class="RktSym">racket/port</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Usually it</span><span class="RktCmt">'</span><span class="RktCmt">s OK to just use display and friends directly.</span></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Here we have a console output driver just to show how it</span><span class="RktCmt">'</span><span class="RktCmt">s done.</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-process%29%29" class="RktValLink" data-pltdoc="x">name-process</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">console-output-driver</span></td></tr><tr><td><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></td></tr><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="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">console-output</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-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="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">console-output</span><span class="hspace">&nbsp;</span><span class="RktSym">item</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="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"~a"</span><span class="hspace">&nbsp;</span><span class="RktSym">item</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="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><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;</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-process%29%29" class="RktValLink" data-pltdoc="x">name-process</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">console-input-driver</span></td></tr><tr><td><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></td></tr><tr><td><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="RktVal">'</span><span class="RktVal">input-relay</span></td></tr><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="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">console-input</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-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</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-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">console-output</span><span class="hspace">&nbsp;</span><span class="RktVal">"Connection terminated.\n"</span><span class="RktPn">)</span><span class="RktPn">)</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-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></td></tr><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="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">read-line-evt</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._current-input-port%29%29" class="RktValLink" data-pltdoc="x">current-input-port</a></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">any</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="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;</span><span class="RktPn">[</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="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="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="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof-object~3f%29%29" class="RktValLink" data-pltdoc="x">eof-object?</a></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">console-output</span><span class="hspace">&nbsp;</span><span class="RktVal">"Terminating on local EOF.\n"</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._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">input-relay</span><span class="RktPn">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="RktPn">[</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="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="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="RktSym"><a href="http://docs.racket-lang.org/reference/strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace">&nbsp;</span><span class="RktSym">line</span><span class="RktPn">)</span><span class="RktPn">)</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-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">console-input</span><span class="hspace">&nbsp;</span><span class="RktSym">line</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><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-typed..rkt%29._name-process%29%29" class="RktValLink" data-pltdoc="x">name-process</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">outbound-connection</span></td></tr><tr><td><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="http://docs.racket-lang.org/reference/let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-handle</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">outbound</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">remote</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">tcp-address</span><span class="hspace">&nbsp;</span><span class="RktVal">"localhost"</span><span class="hspace">&nbsp;</span><span class="RktVal">5999</span><span class="RktPn">)</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-typed..rkt%29._transition%2Fno-state%29%29" class="RktStxLink" data-pltdoc="x">transition/no-state</a></span></td></tr><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="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">console-input</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-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</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._quit%29%29" class="RktValLink" data-pltdoc="x">quit</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-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">[</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">console-input</span><span class="hspace">&nbsp;</span><span class="RktSym">line</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">console-output</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"&gt; ~a \n"</span><span class="hspace">&nbsp;</span><span class="RktSym">line</span><span class="RktPn">)</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">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktSym">remote</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/strings.html#%28def._%28%28quote._~23~25kernel%29._string-append%29%29" class="RktValLink" data-pltdoc="x">string-append</a></span><span class="hspace">&nbsp;</span><span class="RktSym">line</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</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="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="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">local</span><span class="hspace">&nbsp;</span><span class="RktSym">remote</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="RktPn">)</span></td></tr><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="RktPn">(</span><span class="RktSym">tcp-channel</span><span class="hspace">&nbsp;</span><span class="RktSym">remote</span><span class="hspace">&nbsp;</span><span class="RktSym">local</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-untyped..rkt%29._on-absence%29%29" class="RktStxLink" data-pltdoc="x">on-absence</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._quit%29%29" class="RktValLink" data-pltdoc="x">quit</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-untyped..rkt%29._on-message%29%29" class="RktStxLink" data-pltdoc="x">on-message</a></span></td></tr><tr><td><span class="hspace">&nbsp;</span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</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="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="hspace">&nbsp;</span><span class="RktPn">(</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="RktSym"><a href="http://docs.racket-lang.org/reference/port-ops.html#%28def._%28%28quote._~23~25kernel%29._eof-object~3f%29%29" class="RktValLink" data-pltdoc="x">eof-object?</a></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._quit%29%29" class="RktValLink" data-pltdoc="x">quit</a></span><span class="RktPn">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym">tcp-channel</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="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="hspace">&nbsp;</span><span class="RktSym">data</span><span class="RktPn">)</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-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">console-output</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._format%29%29" class="RktValLink" data-pltdoc="x">format</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"&lt; ~a"</span><span class="hspace">&nbsp;</span><span class="RktSym">data</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><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote></blockquote></blockquote><div class="navsetbottom"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="Management_and_Monitoring.html" title="backward to &quot;5 Management and Monitoring&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;<span class="nonavigation">next &rarr;</span></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>