190 lines
109 KiB
HTML
190 lines
109 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>Intermezzo 2: Quote, Unquote</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="shared.css" title="default"/><link rel="stylesheet" type="text/css" href="racket.css" title="default"/><link rel="stylesheet" type="text/css" href="figure.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><script type="text/javascript" src="figure.js"></script><script type="text/javascript" src="manual-racket.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,"tocview_0");">▼</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">How to Design Programs, Second Edition</a></td></tr></table></div><div class="tocviewsublisttop" style="display: block;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right"></td><td><a href="part_preface.html" class="tocviewlink" data-pltdoc="x">Preface</a></td></tr><tr><td align="right"></td><td><a href="part_prologue.html" class="tocviewlink" data-pltdoc="x">Prologue:<span class="mywbr"> </span> How to Program</a></td></tr><tr><td align="right">I </td><td><a href="part_one.html" class="tocviewlink" data-pltdoc="x">Fixed-<wbr></wbr>Size Data</a></td></tr><tr><td align="right"></td><td><a href="i1-2.html" class="tocviewlink" data-pltdoc="x">Intermezzo 1: Beginning Student Language</a></td></tr><tr><td align="right">II </td><td><a href="part_two.html" class="tocviewlink" data-pltdoc="x">Arbitrarily Large Data</a></td></tr><tr><td align="right"></td><td><a href="i2-3.html" class="tocviewselflink" data-pltdoc="x">Intermezzo 2: Quote, Unquote</a></td></tr><tr><td align="right">III </td><td><a href="part_three.html" class="tocviewlink" data-pltdoc="x">Abstraction</a></td></tr><tr><td align="right"></td><td><a href="i3-4.html" class="tocviewlink" data-pltdoc="x">Intermezzo 3: Scope and Abstraction</a></td></tr><tr><td align="right">IV </td><td><a href="part_four.html" class="tocviewlink" data-pltdoc="x">Intertwined Data</a></td></tr><tr><td align="right"></td><td><a href="i4-5.html" class="tocviewlink" data-pltdoc="x">Intermezzo 4: The Nature of Numbers</a></td></tr><tr><td align="right">V </td><td><a href="part_five.html" class="tocviewlink" data-pltdoc="x">Generative Recursion</a></td></tr><tr><td align="right"></td><td><a href="i5-6.html" class="tocviewlink" data-pltdoc="x">Intermezzo 5: The Cost of Computation</a></td></tr><tr><td align="right">VI </td><td><a href="part_six.html" class="tocviewlink" data-pltdoc="x">Accumulators</a></td></tr><tr><td align="right"></td><td><a href="part_epilogue.html" class="tocviewlink" data-pltdoc="x">Epilogue:<span class="mywbr"> </span> Moving On</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,"tocview_1");">►</a></td><td></td><td><a href="i2-3.html" class="tocviewselflink" data-pltdoc="x">Intermezzo 2: Quote, Unquote</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right"></td><td><a href="i2-3.html#%28part._.Quote%29" class="tocviewlink" data-pltdoc="x">Quote</a></td></tr><tr><td align="right">
|
||
|
the basis of our teaching languages.<span class="refelem"><span class="refcolumn"><span class="refcontent">Be sure to set your
|
||
|
language level to BSL+ or up.</span></span></span> For the design of programs, it is
|
||
|
critical to understand how lists are constructed from first principles; it
|
||
|
informs the creation of our programs. Routine work with lists calls for a
|
||
|
compact notation, however, like the <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> function introduced in
|
||
|
<a href="part_two.html#%28part._sec~3aabbrev%29" data-pltdoc="x">The <span class="RktSym"><span class="RktValLink">list</span></span> Function</a>.</p><p>Since the late 1950s, Lisp-style languages have come with an even more
|
||
|
powerful pair of list-creation tools: quotation and anti-quotation. Many
|
||
|
programming languages support them now, and the PHP web page design
|
||
|
language injected the idea into the commercial world.</p><p>This intermezzo gives you a taste of this quotation mechanism. It also
|
||
|
introduces <span class="emph">symbols</span>, a form of data that is intimately tied to
|
||
|
quotation. While this introduction is informal and uses simplistic
|
||
|
examples, the rest of the book illustrates the power of the idea
|
||
|
with near-realistic variants. Come back to this intermezzo if any
|
||
|
of these examples cause you trouble.</p><h3><a name="(part._.Quote)"></a>Quote</h3><p><span style="font-style: italic">Quotation</span> is a short-hand mechanism for writing down a large list
|
||
|
easily. Roughly speaking, a list constructed with the <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span>
|
||
|
function can be constructed even more concisely by quoting
|
||
|
lists. Conversely, a quoted list abbreviates a construction with
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span>.</p><p><div class="SIntrapara"><a name="(idx._(gentag._350))"></a>
|
||
|
Technically, <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> is a keyword for a compound sentence in the
|
||
|
spirit of <a href="i1-2.html" data-pltdoc="x">Intermezzo 1: Beginning Student Language</a> and it is used like this: <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktVal">1</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">2</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktMeta"></span>.
|
||
|
DrRacket translates this expression to <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">3</span><span class="RktPn">)</span>. At this point,
|
||
|
you may wonder why we call <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> an abbreviation because the
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>d expression looks more complicated than its
|
||
|
translation. The key is that <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> is a short-hand for <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>. Here
|
||
|
are some short examples, then:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list 1 2 3)</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">"b"</span><span class="hspace"> </span><span class="RktVal">"c"</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list "a" "b" "c")</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">#true</span><span class="hspace"> </span><span class="RktVal">"hello world"</span><span class="hspace"> </span><span class="RktVal">42</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list #true "hello world" 42)</span></p></td></tr></table></blockquote></div><div class="SIntrapara">As you can see, the use of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> creates the promised lists.
|
||
|
In case you forgot what <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">3</span><span class="RktPn">)</span> means, reread
|
||
|
<a href="part_two.html#%28part._sec~3aabbrev%29" data-pltdoc="x">The <span class="RktSym"><span class="RktValLink">list</span></span> Function</a>; it explains that this list is short for
|
||
|
<span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="stt"> </span><span class="RktVal">3</span><span class="stt"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span>.</div></p><p><div class="SIntrapara">So far <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> looks like a small improvement over <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span>,
|
||
|
but look:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"b"</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"d"</span><span class="hspace"> </span><span class="RktVal">4</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">(list (list "a" 1) (list "b" 2) (list "d" 4))</span></p></td></tr></table></blockquote></div><div class="SIntrapara">With <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> we can construct lists as well as nested lists.</div></p><p><div class="SIntrapara">To understand how <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> works, imagine it as a function that traverses
|
||
|
the shape it is given. When <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> encounters a plain piece of data—<wbr></wbr>a number, a
|
||
|
string, a Boolean, or an image—<wbr></wbr>it disappears. When it sits in front of an
|
||
|
open parenthesis, <span class="RktInBG"><span class="hspace"></span><span class="RktIn">(</span><span class="hspace"></span></span>, it inserts <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> to the right of the
|
||
|
parenthesis and puts <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> on all the items between <span class="RktInBG"><span class="hspace"></span><span class="RktIn">(</span><span class="hspace"></span></span> and the closing
|
||
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">)</span><span class="hspace"></span></span>. For example,
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">As you already know, <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> disappears from numbers so the rest is easy. Here
|
||
|
is an example that creates nested lists:
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">To continue this example, we expand the abbreviation in the first position:
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">3</span><span class="RktPn">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">We leave it to you to wrap up this example.</div></p><p><div class="SIntrapara"><a name="(counter._(exercise._ex~3aquote-list))"></a><span style="font-weight: bold">Exercise</span> 231. Eliminate <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> in favor of <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> from these
|
||
|
expressions:
|
||
|
</div><div class="SIntrapara"><ul><li><p><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">"a"</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">#false</span><span class="stt"> </span><span class="RktVal">3</span><span class="stt"> </span><span class="RktVal">"c"</span><span class="RktVal">)</span></p></li><li><p><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span></p></li><li><p><div class="SIntrapara">and this table-like shape:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">"alan"</span><span class="hspace"> </span><span class="RktVal">1000</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"barb"</span><span class="hspace"> </span><span class="RktVal">2000</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"carl"</span><span class="hspace"> </span><span class="RktVal">1500</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></blockquote></div></p></li></ul></div><div class="SIntrapara">Now eliminate <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> in favor of <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span> where needed. <a href="i2-3.html#%28counter._%28exercise._ex~3aquote-list%29%29" class="ex-end" data-pltdoc="x"></a></div></p><h3><a name="(part._.Quasiquote_and_.Unquote)"></a>Quasiquote and Unquote</h3><p>The preceding section should convince you of the advantages of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> and
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>. You may even wonder why the book introduces <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>
|
||
|
only now and didn’t do so right from the start. It seems to greatly facilitate the
|
||
|
formulation of test cases that involve lists as well as for keeping track
|
||
|
of large collections of data. But all good things come with surprises, and
|
||
|
that includes <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>.</p><p>When it comes to program design, it is misleading for beginners to think of lists
|
||
|
as <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>d or even <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span>-constructed values. The construction of
|
||
|
lists with <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span> is far more illuminating for the step-wise creation of
|
||
|
programs than short-hands such as <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>, which hide the underlying
|
||
|
construction. So don’t forget to think of <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span> whenever you are
|
||
|
stuck during the design of a list-processing function.</p><p><div class="SIntrapara">Let’s move on, then, to the actual surprises hidden behind <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>. Suppose
|
||
|
your definitions area contains one constant definition:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="hspace"> </span><span class="RktVal">42</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">Imagine running this program and experimenting with
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">40</span><span class="hspace"> </span><span class="RktVal">41</span><span class="hspace"> </span><span class="RktVal">x</span><span class="hspace"> </span><span class="RktVal">43</span><span class="hspace"> </span><span class="RktVal">44</span><span class="RktVal">)</span></p></blockquote></div><div class="SIntrapara">in the interactions area. What result do you expect? Stop! Try to apply the
|
||
|
above rules of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> for a moment.</div></p><p><div class="SIntrapara">Here is the experiment
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">40</span><span class="hspace"> </span><span class="RktVal">41</span><span class="hspace"> </span><span class="RktVal">x</span><span class="hspace"> </span><span class="RktVal">43</span><span class="hspace"> </span><span class="RktVal">44</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list 40 41 'x 43 44)</span></p></td></tr></table></blockquote></div><div class="SIntrapara">At this point it is important to remember that DrRacket displays
|
||
|
values. Everything on the list is a value, including <span class="RktVal">'</span><span class="RktVal">x</span>. It is a
|
||
|
value you have never seen before, namely, a <a name="(tech._symbol)"></a><span style="font-style: italic">Symbol</span>. For our
|
||
|
purposes, a symbol looks like a variable name except that it starts with
|
||
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> and that <span style="font-weight: bold">a symbol is a value</span>. Variables only stand for values;
|
||
|
they are not values in and of themselves. Symbols play a role similar to
|
||
|
those of strings; they are a great way to represent symbolic information
|
||
|
as data. <a href="part_four.html" data-pltdoc="x">Intertwined Data</a> illustrates how; for now, we just accept
|
||
|
symbols as yet another form of data.</div></p><p><div class="SIntrapara">To drive home the idea of symbols, consider a second example:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">+</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></p></blockquote></div><div class="SIntrapara">You might expect that this expression constructs <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">3</span><span class="RktPn">)</span>. If
|
||
|
you use the rules for expanding <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span>, however, you discover that
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">+</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">+</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">And the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> on the second item in this list does not disappear. Instead, it
|
||
|
abbreviates the construction of another list so that the entire example comes
|
||
|
out as
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">+</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">What this means is that <span class="RktVal">'</span><span class="RktVal">+</span> is a symbol just like <span class="RktVal">'</span><span class="RktVal">x</span>. Just
|
||
|
as the latter is unrelated to the variable <span class="RktSym">x</span>, the former has no
|
||
|
immediate relationship to the function <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span> that comes with BSL+.
|
||
|
Then again, you should be able to imagine that <span class="RktVal">'</span><span class="RktVal">+</span> could serve as an
|
||
|
elegant <a name="(idx._(gentag._351))"></a>data representation of the function <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span> just as <span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">+</span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">1</span><span class="RktVal">)</span>
|
||
|
could serve as a data representation of <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">1</span><span class="RktPn">)</span>. <a href="part_four.html" data-pltdoc="x">Intertwined Data</a> picks up this idea.</div></p><p>In some cases, you do not want to create a nested list. You actually want
|
||
|
a true expression in a <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>d list and you want to evaluate the
|
||
|
expression during the construction of the list. For such cases, you want
|
||
|
to use <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span>, which, like <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>, is just a
|
||
|
keyword for a compound sentence: <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktVal">1</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">2</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktMeta"></span>. And, like
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>, <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span> comes with a short-hand, namely the
|
||
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span> character, which is the “other” single-quote key on your keyboard.</p><p><div class="SIntrapara">At first glance, <span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span> acts just like <span class="RktInBG"><span class="hspace"></span><span class="RktIn">'</span><span class="hspace"></span></span> in that it constructs lists:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list 1 2 3)</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">"a"</span><span class="hspace"> </span><span class="RktVal">"b"</span><span class="hspace"> </span><span class="RktVal">"c"</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list "a" "b" "c")</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">#true</span><span class="hspace"> </span><span class="RktVal">"hello world"</span><span class="hspace"> </span><span class="RktVal">42</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list #true "hello world" 42)</span></p></td></tr></table></blockquote></div><div class="SIntrapara">The best part about <span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span> is that you can also use it to <span style="font-style: italic">unquote</span>, that is,
|
||
|
you can demand an escape back to the programming language proper inside
|
||
|
of a <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span>d list. Let’s illustrate the idea with the above
|
||
|
examples:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">40</span><span class="hspace"> </span><span class="RktVal">41</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">x</span><span class="hspace"> </span><span class="RktVal">43</span><span class="hspace"> </span><span class="RktVal">44</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list 40 41 42 43 44)</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td></tr><tr><td><p><span class="RktRes">(list 1 2 3)</span></p></td></tr></table></blockquote></div><div class="SIntrapara">As above, the first interaction assumes a definitions area that contains
|
||
|
<span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="stt"> </span><span class="RktSym">x</span><span class="stt"> </span><span class="RktVal">42</span><span class="RktPn">)</span>. The best way to understand this syntax is to see
|
||
|
it with actual keywords instead of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span> and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">,</span><span class="hspace"></span></span> short-hands:
|
||
|
<a name="(idx._(gentag._352))"></a>
|
||
|
<a name="(idx._(gentag._353))"></a>
|
||
|
<a name="(idx._(gentag._354))"></a>
|
||
|
<a name="(idx._(gentag._355))"></a>
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktVal">40</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">41</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">43</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">44</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktMeta"></span></td></tr><tr><td><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktVal">1</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">1</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">1</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktMeta"></span><span class="hspace"> </span><span class="RktMeta"></span><span class="RktVal">3</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktMeta"></span></td></tr></table></blockquote></div></p><p><div class="SIntrapara">The rules for expanding a <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span>d and an <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span>d
|
||
|
shape are those of <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span> supplemented with one rule. When <span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span>
|
||
|
appears in front of a parenthesis, it is distributed over all parts
|
||
|
between it and the matching closing parenthesis. When it appears next to a
|
||
|
basic piece of data, it disappears. When it is in front of some variable
|
||
|
name, you get a symbol. And the new rule is that when <span class="RktInBG"><span class="hspace"></span><span class="RktIn">`</span><span class="hspace"></span></span> is immediately
|
||
|
followed by <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span>, both characters disappear:
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktVal">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">and
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">3</span><span class="RktPn">)</span></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">1</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">3</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">And this is how you get <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="stt"> </span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">3</span><span class="RktPn">)</span> as seen above.</div></p><p>From here it is a short step to the production of web pages. Yes, you read
|
||
|
correctly—<wbr></wbr>web pages! In principle, web pages are coded in the HTML and
|
||
|
CSS programming languages. But nobody writes down HTML programs directly;
|
||
|
instead people design programs that produce web pages. Not surprisingly,
|
||
|
you can write such functions in BSL+, too, and there is a simplistic
|
||
|
example in <a href="i2-3.html#%28counter._%28figure._fig~3asimplistic-html%29%29" data-pltdoc="x">figure <span class="FigureRef">83</span></a>.
|
||
|
As you can immediately see, this function consumes two strings and
|
||
|
produces a deeply nested list—<wbr></wbr>a data representation of a web page.
|
||
|
<a name="(idx._(gentag._356))"></a></p><blockquote class="Figure"><blockquote class="Centerfigure"><blockquote class="FigureInside"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><a href="part_one.html#%28tech._string%29" class="techoutside" data-pltdoc="x"><span class="techinside">String</span></a><span class="RktCmt"> </span><a href="part_one.html#%28tech._string%29" class="techoutside" data-pltdoc="x"><span class="techinside">String</span></a><span class="RktCmt"> -> </span>...<span class="RktCmt"> deeply nested list </span>...</td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><span class="RktCmt">produces a web page with given </span><span class="RktSym">author</span><span class="RktCmt"> and </span><span class="RktSym">title</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">my-first-web-page</span><span class="hspace"> </span><span class="RktSym">author</span><span class="hspace"> </span><span class="RktSym">title</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">html</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">head</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">title</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">title</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">meta</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">http-equiv</span><span class="hspace"> </span><span class="RktVal">"content-type"</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">content</span><span class="hspace"> </span><span class="RktVal">"text-html"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">body</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">h1</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">title</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace"> </span><span class="RktVal">"I, "</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">author</span><span class="hspace"> </span><span class="RktVal">", made this page."</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></blockquote></blockquote><p class="Centertext"><span class="Legend"><span class="FigureTarget"><a name="(counter._(figure._fig~3asimplistic-html))" x-target-lift="Figure"></a>Figure 83: </span>A simplistic HTML generator</span></p></blockquote><p>A second look also shows that the <span class="RktSym">title</span> parameter shows up twice
|
||
|
in the function body: once nested in a nested list labeled with
|
||
|
<span class="RktVal">'</span><span class="RktVal">head</span> and once nested in the nested list labeled with
|
||
|
<span class="RktVal">'</span><span class="RktVal">body</span>. The other parameter shows up only once. We consider the
|
||
|
nested list a page template, and the parameters are holes in the template,
|
||
|
to be filled by useful values. As you can imagine, this template-driven
|
||
|
style of creating web pages is most
|
||
|
useful when you wish to create many similar pages for a site.</p><blockquote class="Figure"><blockquote class="Centerfigure"><blockquote class="FigureInside"><table cellspacing="0" cellpadding="0"><tr><td valign="top"><p>Nested List Representation</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>Web Page Code (HTML)</p></td></tr><tr><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktRes">'</span><span class="RktRes">(</span><span class="RktRes">html</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">head</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">title</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"Hello World"</span><span class="RktRes">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">meta</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">(</span><span class="RktRes">http-equiv</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"content-type"</span><span class="RktRes">)</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">content</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"text-html"</span><span class="RktRes">)</span><span class="RktRes">)</span><span class="RktRes">)</span><span class="RktRes">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">body</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">h1</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"Hello World"</span><span class="RktRes">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">p</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"I, "</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"Matthias"</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">", made this page."</span><span class="RktRes">)</span><span class="RktRes">)</span><span class="RktRes">)</span></td></tr></table></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><table cellspacing="0" cellpadding="0" class="SVerbatim"><tr><td><p><span class="stt"><html></span></p></td></tr><tr><td><p><span class="stt"></span><span class="hspace"> </span><span class="stt"><head></span></p></td></tr><tr><td><p><span class="stt"></span><span class="hspace"> </span><span class="stt"><title></span></p></td></tr><tr><td><p><span class="stt"></span><span class="hspace"> </span><span class="stt">Hello World</span></p></td></tr><tr><td><p><span class="stt"></span><span class="hspace"> </span><span class="stt"></title></span></p></td></tr><tr><td><p><span class="stt"></span><span class="hspace"> </span><span class="stt"><meta</spa
|
||
|
area. Given your knowledge of <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span> and <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span>,
|
||
|
you should be able to predict what the result of
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym">my-first-web-page</span><span class="hspace"> </span><span class="RktVal">"Matthias"</span><span class="hspace"> </span><span class="RktVal">"Hello World"</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">is. Then again, DrRacket is so fast that it is better to show you the result:
|
||
|
see the left column in <a href="i2-3.html#%28counter._%28figure._fig~3anested-list-rep%29%29" data-pltdoc="x">figure <span class="FigureRef">84</span></a>.<span class="refelem"><span class="refcolumn"><span class="refcontent">You
|
||
|
can use <span class="RktSym">show-in-browser</span> from <span class="sroman">the <span class="Smaller"><span style="font-style: italic">2htdp/web-io.rkt</span></span> teachpack</span> to display the
|
||
|
result in a web browser.</span></span></span> The right column of the table contains the
|
||
|
equivalent code in HTML. If you
|
||
|
were to open this web page in a browser you would see something like this:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCentered"><p><img src="web-page1.png" alt="" width="237" height="149"/></p></blockquote></div><div class="SIntrapara">Note that <span class="RktVal">"Hello World"</span> shows up twice again: once in the title
|
||
|
bar of the web browser—<wbr></wbr>which is due to the <span class="stt"><title></span>
|
||
|
specification—<wbr></wbr>and once in the text of the web page.</div></p><p>If this were 1993, you could now sell the above function as a Dot Com
|
||
|
company that generates people’s first web page with a simple function
|
||
|
call. Alas, in this day and age, it is only an exercise.</p><p><div class="SIntrapara"><a name="(counter._(exercise._ex~3aquasi-un))"></a><span style="font-weight: bold">Exercise</span> 232. Eliminate <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span> and <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span> from
|
||
|
the following expressions so that they are written with <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> instead:
|
||
|
</div><div class="SIntrapara"><ul><li><p><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">"a"</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">#false</span><span class="stt"> </span><span class="RktVal">3</span><span class="stt"> </span><span class="RktVal">"c"</span><span class="RktVal">)</span></p></li><li><p><div class="SIntrapara">this table-like shape:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">"alan"</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2A%29%29" class="RktValLink" data-pltdoc="x">*</a></span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">500</span><span class="RktPn">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"barb"</span><span class="hspace"> </span><span class="RktVal">2000</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._string-append%29%29" class="RktValLink" data-pltdoc="x">string-append</a></span><span class="hspace"> </span><span class="RktVal">"carl"</span><span class="hspace"> </span><span class="RktVal">" , the great"</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">1500</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"dawn"</span><span class="hspace"> </span><span class="RktVal">2300</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></blockquote></div></p></li><li><p><div class="SIntrapara">and this second web page:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">html</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">head</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">title</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">title</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">body</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">h1</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktSym">title</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace"> </span><span class="RktVal">"A second web page"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></blockquote></div><div class="SIntrapara">where <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="stt"> </span><span class="RktSym">title</span><span class="stt"> </span><span class="RktVal">"ratings"</span><span class="RktPn">)</span>.</div></p></li></ul></div><div class="SIntrapara">Also write down the nested lists that the expressions produce. <a href="i2-3.html#%28counter._%28exercise._ex~3aquasi-un%29%29" class="ex-end" data-pltdoc="x"></a></div></p><h3><a name="(part._.Unquote_.Splice)"></a>Unquote Splice</h3><p><div class="SIntrapara">When <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span> meets <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span> during the expansion of
|
||
|
short-hands, the two annihilate each other:
|
||
|
</div><div class="SIntrapara"><blockquote><table cellspacing="0" cellpadding="0"><tr><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">tr</span></td></tr><tr><td><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym">make-row</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktVal">)</span></td></tr></table></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><p>is short for</p></td><td valign="top"><p><span class="hspace"> </span></p></td><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">tr</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-row</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></div><div class="SIntrapara">Thus, whatever <span class="RktSym">make-row</span> produces becomes the second item of the
|
||
|
list. In particular, if <span class="RktSym">make-row</span> produces a list, this list becomes the
|
||
|
second item of a list. If <span class="RktSym">make-row</span> translates the given list of
|
||
|
numbers into a list of strings, then the result is
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">"3"</span><span class="hspace"> </span><span class="RktVal">"4"</span><span class="hspace"> </span><span class="RktVal">"5"</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">In some cases, however, we may want to splice such a nested list into the outer
|
||
|
one, so that for our running example we would get
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktVal">"3"</span><span class="hspace"> </span><span class="RktVal">"4"</span><span class="hspace"> </span><span class="RktVal">"5"</span><span class="RktPn">)</span></p></blockquote></div></p><p><div class="SIntrapara">One way to solve this small problem is to fall back on <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span>. That is, to
|
||
|
mix <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span> with <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quote%29%29" class="RktStxLink" data-pltdoc="x">quote</a></span>, <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._quasiquote%29%29" class="RktStxLink" data-pltdoc="x">quasiquote</a></span>, and
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote%29%29" class="RktStxLink" data-pltdoc="x">unquote</a></span>. After all, all of these characters are just short-hands for
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span>ed lists. Here is what is needed to get the desired result in our
|
||
|
example:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">Convince yourself that the result is <span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="stt"> </span><span class="RktVal">'</span><span class="RktVal">tr</span><span class="stt"> </span><span class="RktVal">"3"</span><span class="stt"> </span><span class="RktVal">"4"</span><span class="stt"> </span><span class="RktVal">"5"</span><span class="RktPn">)</span>.</div></p><p><div class="SIntrapara">Since this situation occurs quite often in practice, BSL+ supports one more
|
||
|
short-hand mechanism for list creation: <span class="RktVal">,@</span>, also known as
|
||
|
<span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._unquote-splicing%29%29" class="RktStxLink" data-pltdoc="x">unquote-splicing</a></span> in keyword form. With this form, it is
|
||
|
straightforward to splice a nested list into a surrounding list. For example,
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktRdr">,@</span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktVal">)</span></p></blockquote></div><div class="SIntrapara">translates into
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span></p></blockquote></div><div class="SIntrapara">which is precisely what we need for our example.</div></p><p><div class="SIntrapara">Now consider the problem of creating an HTML table in our nested-list
|
||
|
representation. Here is a table of two rows with four cells each:
|
||
|
</div><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">'</span><span class="RktRes">(</span><span class="RktRes">table</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">(</span><span class="RktRes">border</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"1"</span><span class="RktRes">)</span><span class="RktRes">)</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">tr</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"1"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"2"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"3"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"4"</span><span class="RktRes">)</span><span class="RktRes">)</span></td></tr><tr><td><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">tr</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"2.8"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"-1.1"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"3.4"</span><span class="RktRes">)</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">(</span><span class="RktRes">td</span><span class="RktRes"><span class="hspace"> </span></span><span class="RktRes">"1.3"</span><span class="RktRes">)</span><span class="RktRes">)</span><span class="RktRes">)</span></td></tr></table></blockquote></div><div class="SIntrapara">The first nested lists tells HTML to draw a thin border around each cell in the
|
||
|
table; the other two nested lists represent a row each.</div></p><p><div class="SIntrapara">In practice, you want to create such tables with arbitrarily wide rows and
|
||
|
arbitrarily many rows. For now, we just deal with the first problem, which
|
||
|
requires a function that translates lists of numbers into HTML rows:
|
||
|
<a name="(idx._(gentag._357))"></a> <a name="(idx._(gentag._358))"></a>
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><a href="part_two.html#%28tech._list._of._number%29" class="techoutside" data-pltdoc="x"><span class="techinside">List-of-numbers</span></a><span class="RktCmt"> -> </span>...<span class="RktCmt"> nested list </span>...</td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><span class="RktCmt">creates a row for an HTML table from </span><span class="RktSym">l</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktSym">l</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cond%29%29" class="RktStxLink" data-pltdoc="x">cond</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._empty~3f%29%29" class="RktValLink" data-pltdoc="x">empty?</a></span><span class="hspace"> </span><span class="RktSym">l</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._else%29%29" class="RktStxLink" data-pltdoc="x">else</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-cell</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._first%29%29" class="RktValLink" data-pltdoc="x">first</a></span><span class="hspace"> </span><span class="RktSym">l</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._rest%29%29" class="RktValLink" data-pltdoc="x">rest</a></span><span class="hspace"> </span><span class="RktSym">l</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"> </span></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><a href="part_one.html#%28tech._number%29" class="techoutside" data-pltdoc="x"><span class="techinside">Number</span></a><span class="RktCmt"> -> </span>...<span class="RktCmt"> nested list </span>...</td></tr><tr><td><sp
|
||
|
DrRacket’s interactions area:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">make-cell</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">(list 'td "2")</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">(list (list 'td "1") (list 'td "2"))</span></p></td></tr></table></blockquote></div><div class="SIntrapara">These interactions show the creation of lists that represent a cell and a row.</div></p><p><div class="SIntrapara">To turn such row lists into actual rows of an HTML table representation, we need
|
||
|
to splice them into a list that starts with <span class="RktVal">'</span><span class="RktVal">tr</span>:
|
||
|
<a name="(idx._(gentag._359))"></a>
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><a href="part_two.html#%28tech._list._of._number%29" class="techoutside" data-pltdoc="x"><span class="techinside">List-of-numbers</span></a><span class="RktCmt"> </span><a href="part_two.html#%28tech._list._of._number%29" class="techoutside" data-pltdoc="x"><span class="techinside">List-of-numbers</span></a><span class="RktCmt"> -> </span>...<span class="RktCmt"> nested list </span>...</td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt"> </span><span class="RktCmt">creates an HTML table from two lists of numbers </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-table</span><span class="hspace"> </span><span class="RktSym">row1</span><span class="hspace"> </span><span class="RktSym">row2</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">table</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">border</span><span class="hspace"> </span><span class="RktVal">"1"</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktRdr">,@</span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktSym">row1</span><span class="RktPn">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktRdr">,@</span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktSym">row2</span><span class="RktPn">)</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">This function consumes two lists of numbers and creates an HTML table
|
||
|
representation. With <span class="RktSym">make-row</span>, it translates the lists into lists of
|
||
|
cell representations. With <span class="RktVal">,@</span> these lists are spliced into the table
|
||
|
template:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">make-table</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">3</span><span class="hspace"> </span><span class="RktVal">4</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">3.5</span><span class="hspace"> </span><span class="RktVal">2.8</span><span class="hspace"> </span><span class="RktVal"><span class="nobreak">-1</span>.1</span><span class="hspace"> </span><span class="RktVal">3.4</span><span class="hspace"> </span><span class="RktVal">1.3</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">(list 'table (list (list 'border "1")) '....)</span></p></td></tr></table></blockquote></div><div class="SIntrapara">This<span class="refelem"><span class="refcolumn"><span class="refcontent">The dots are <span style="font-weight: bold">not</span> part of the output.</span></span></span>
|
||
|
application of <span class="RktSym">make-table</span> suggests another reason why people
|
||
|
write programs to create web pages rather than make them by hand.</div></p><p><div class="SIntrapara"><a name="(counter._(exercise._ex~3aunquote-splicing))"></a><span style="font-weight: bold">Exercise</span> 233. Develop alternatives to the following
|
||
|
expressions that use only <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span> and produce the same values:
|
||
|
</div><div class="SIntrapara"><ul><li><p><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">0</span><span class="stt"> </span><span class="RktRdr">,@</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">1</span><span class="stt"> </span><span class="RktVal">2</span><span class="stt"> </span><span class="RktVal">3</span><span class="RktVal">)</span><span class="stt"> </span><span class="RktVal">4</span><span class="RktVal">)</span></p></li><li><p><div class="SIntrapara">this table-like shape:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">"alan"</span><span class="hspace"> </span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._%2A%29%29" class="RktValLink" data-pltdoc="x">*</a></span><span class="hspace"> </span><span class="RktVal">2</span><span class="hspace"> </span><span class="RktVal">500</span><span class="RktPn">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"barb"</span><span class="hspace"> </span><span class="RktVal">2000</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktRdr">,@</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"carl"</span><span class="hspace"> </span><span class="RktVal">" , the great"</span><span class="RktVal">)</span><span class="hspace"> </span><span class="RktVal">1500</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">"dawn"</span><span class="hspace"> </span><span class="RktVal">2300</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></blockquote></div></p></li><li><p><div class="SIntrapara">and this third web page:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">html</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">body</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">table</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">border</span><span class="hspace"> </span><span class="RktVal">"1"</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">width</span><span class="hspace"> </span><span class="RktVal">"200"</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktRdr">,@</span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="hspace"> </span><span class="RktVal">1</span><span class="hspace"> </span><span class="RktVal">2</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">tr</span><span class="hspace"> </span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">width</span><span class="hspace"> </span><span class="RktVal">"200"</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktRdr">,@</span><span class="RktPn">(</span><span class="RktSym">make-row</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">99</span><span class="hspace"> </span><span class="RktVal">65</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktVal">)</span></td></tr></table></blockquote></div><div class="SIntrapara">where <span class="RktSym">make-row</span> is the function from above.</div></p></li></ul></div><div class="SIntrapara">Use <span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._check-expect%29%29" class="RktStxLink" data-pltdoc="x">check-expect</a></span> to check your work. <a href="i2-3.html#%28counter._%28exercise._ex~3aunquote-splicing%29%29" class="ex-end" data-pltdoc="x"></a></div></p><p><div class="SIntrapara"><a name="(counter._(exercise._ex~3arankings-splicing))"></a><span style="font-weight: bold">Exercise</span> 234. Create the function <span class="RktSym">make-ranking</span>, which consumes
|
||
|
a list of ranked song titles and produces a list representation of an HTML
|
||
|
table. Consider this example:
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">one-list</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Asia: Heat of the Moment"</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">"U2: One"</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">"The White Stripes: Seven Nation Army"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">If you apply <span class="RktSym">make-ranking</span> to <span class="RktSym">one-list</span> and display the
|
||
|
resulting web page in a browser, you see something like the screen
|
||
|
shot in <a href="i2-3.html#%28counter._%28figure._fig~3amy-second-page%29%29" data-pltdoc="x">figure <span class="FigureRef">85</span></a>.</div></p><blockquote class="Herefigure"><blockquote class="Centerfigure"><blockquote class="FigureInside"><blockquote class="SCentered"><p><img src="web-page2.png" alt="" width="320" height="168"/></p></blockquote></blockquote></blockquote><p class="Centertext"><span class="Legend"><span class="FigureTarget"><a name="(counter._(figure._fig~3amy-second-page))" x-target-lift="Figure"></a>Figure 85: </span>A web page generated with BSL+</span></p></blockquote><p><div class="SIntrapara"><span style="font-weight: bold">Hint</span> Although you could design a function that determines the rankings
|
||
|
from a list of strings, we wish you to focus on the creation of tables
|
||
|
instead. Thus we supply the following functions:
|
||
|
<a name="(idx._(gentag._360))"></a> <a name="(idx._(gentag._361))"></a>
|
||
|
</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">ranking</span><span class="hspace"> </span><span class="RktSym">los</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._reverse%29%29" class="RktValLink" data-pltdoc="x">reverse</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">add-ranks</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._reverse%29%29" class="RktValLink" data-pltdoc="x">reverse</a></span><span class="hspace"> </span><span class="RktSym">los</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">add-ranks</span><span class="hspace"> </span><span class="RktSym">los</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cond%29%29" class="RktStxLink" data-pltdoc="x">cond</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._empty~3f%29%29" class="RktValLink" data-pltdoc="x">empty?</a></span><span class="hspace"> </span><span class="RktSym">los</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="RktPn">]</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">[</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28form._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._else%29%29" class="RktStxLink" data-pltdoc="x">else</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._cons%29%29" class="RktValLink" data-pltdoc="x">cons</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._list%29%29" class="RktValLink" data-pltdoc="x">list</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#%28def._htdp-beginner-abbr._%28%28lib._lang%2Fhtdp-beginner-abbr..rkt%29._length%29%29" class="RktValLink" data-pltdoc="x">length</a></span><span class="hspace"> </span><span class="RktSym">los</span><span class="RktPn">)</span><span
|
||
|
statements. Then explore their workings with interactions in DrRacket.
|
||
|
<a href="part_six.html" data-pltdoc="x">Accumulators</a> expands the design recipe with a way to create
|
||
|
simpler functions for computing rankings than <span class="RktSym">ranking</span> and
|
||
|
<span class="RktSym">add-ranks</span>. <a href="i2-3.html#%28counter._%28exercise._ex~3arankings-splicing%29%29" class="ex-end" data-pltdoc="x"></a></div></p><div class="navsetbottom"><span class="navleft"><div class="nosearchform"></div> <span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="part_two.html" title="backward to "II Arbitrarily Large Data"" data-pltdoc="x">← prev</a> <a href="index.html" title="up to "How to Design Programs, Second Edition"" data-pltdoc="x">up</a> <a href="part_three.html" title="forward to "III Abstraction"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html>
|