<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><title>Steve Losh</title><link href="http://stevelosh.com" /><updated>2013-04-08T10:18:48Z</updated><id>http://stevelosh.com/</id><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/stevelosh" /><feedburner:info uri="stevelosh" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fstevelosh" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fstevelosh" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/stevelosh" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fstevelosh" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fstevelosh" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fstevelosh" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><entry><title type="html">Git Koans</title><author><name>Steve Losh</name></author><link href="http://feedproxy.google.com/~r/stevelosh/~3/YX7dnu5pLBk/" /><updated>2013-04-08T10:16:00Z</updated><published>2013-04-08T10:16:00Z</published><id>http://stevelosh.com/blog/2013/04/git-koans/</id><content type="html">
                    
                        
                
                    &lt;p&gt;Inspired by &lt;a href="http://blog.sanctum.geek.nz/vim-koans/"&gt;Vim Koans&lt;/a&gt;.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#silence"&gt;Silence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#one-thing-well"&gt;One&amp;nbsp;Thing&amp;nbsp;Well&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#only-the-gods"&gt;Only&amp;nbsp;the&amp;nbsp;Gods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-hobgoblin"&gt;The&amp;nbsp;Hobgoblin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-long-and-short-of-it"&gt;The Long and Short&amp;nbsp;of&amp;nbsp;It&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="silence"&gt;Silence&lt;/h2&gt;
&lt;p&gt;A Python programmer handed her &lt;code&gt;~/.gitconfig&lt;/code&gt; to Master Git.  Among the many
lines were&amp;nbsp;the&amp;nbsp;following:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;[alias]
; Explicit is better than implicit.  If we want to merge
; we should do so ourselves.
pull = pull --ff-only
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Master Git nodded.  &amp;#8220;&lt;code&gt;git pull origin master&lt;/code&gt;,&amp;#8221; said&amp;nbsp;the&amp;nbsp;programmer.&lt;/p&gt;
&lt;p&gt;Master Git pulled down the latest changes on &lt;code&gt;master&lt;/code&gt; and automatically merged
them with the&amp;nbsp;programmer&amp;#8217;s&amp;nbsp;changes.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;But Master Git, did I not say to only fast-forward in my configuration?!&amp;#8221;&amp;nbsp;she&amp;nbsp;cried.&lt;/p&gt;
&lt;p&gt;Master Git looked at her, nodded, and&amp;nbsp;said&amp;nbsp;nothing.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Then why did you not warn me of a problem with my configuration?&amp;#8221;&amp;nbsp;she&amp;nbsp;asked.&lt;/p&gt;
&lt;p&gt;Master Git replied: &amp;#8220;there was&amp;nbsp;no&amp;nbsp;problem.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Months later the programmer was reading &lt;code&gt;git --help config&lt;/code&gt; for a different
reason and&amp;nbsp;found&amp;nbsp;enlightenment.&lt;/p&gt;
&lt;h2 id="one-thing-well"&gt;One&amp;nbsp;Thing&amp;nbsp;Well&lt;/h2&gt;
&lt;p&gt;A &lt;span class="caps"&gt;&lt;span class="caps"&gt;UNIX&lt;/span&gt;&lt;/span&gt; programmer was working in the cubicle farms.  As she saw Master Git
traveling down the path, she ran to&amp;nbsp;meet&amp;nbsp;him.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;It is an honor to meet you, Master Git!&amp;#8221; she said.  &amp;#8220;I have been studying the
&lt;span class="caps"&gt;&lt;span class="caps"&gt;UNIX&lt;/span&gt;&lt;/span&gt; way of designing programs that each do one thing well.  Surely I can learn
much&amp;nbsp;from&amp;nbsp;you.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Surely,&amp;#8221; replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;How should I change to a different branch?&amp;#8221; asked&amp;nbsp;the&amp;nbsp;programmer.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Use &lt;code&gt;git checkout&lt;/code&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;And how should I create&amp;nbsp;a&amp;nbsp;branch?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Use &lt;code&gt;git checkout&lt;/code&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;And how should I update the contents of a single file in my working directory,
without involving branches&amp;nbsp;at&amp;nbsp;all?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Use &lt;code&gt;git checkout&lt;/code&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;After this third answer, the programmer&amp;nbsp;was&amp;nbsp;enlightened.&lt;/p&gt;
&lt;h2 id="only-the-gods"&gt;Only&amp;nbsp;the&amp;nbsp;Gods&lt;/h2&gt;
&lt;p&gt;The great historian was trying to unravel the intricacies of an incorrect merge
that had happened many months ago.  He made a pilgrimage to Master Git to ask
for&amp;nbsp;his&amp;nbsp;help.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Master Git,&amp;#8221; said the historian, &amp;#8220;what is the nature&amp;nbsp;of&amp;nbsp;history?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;History is immutable.  To rewrite it later is to tamper with the very fabric&amp;nbsp;of&amp;nbsp;existence.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The historian nodded, then asked: &amp;#8220;Is that why rebasing commits that have been
pushed&amp;nbsp;is&amp;nbsp;discouraged?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Indeed,&amp;#8221; said&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Splendid!&amp;#8221; exclaimed the historian.  &amp;#8220;I have a historical record of a merge
commit with two parents.  How can I find out which branch each parent was
originally&amp;nbsp;made&amp;nbsp;on?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;History is ephemeral,&amp;#8221; replied Master Git, &amp;#8220;the knowledge you seek can be
answered only by&amp;nbsp;the&amp;nbsp;gods.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The historian hung his head as enlightenment crushed down&amp;nbsp;upon&amp;nbsp;him.&lt;/p&gt;
&lt;h2 id="the-hobgoblin"&gt;The&amp;nbsp;Hobgoblin&lt;/h2&gt;
&lt;p&gt;A novice was learning at the feet of Master Git.  At the end of the lesson he
looked through his notes and said, &amp;#8220;Master, I have a few questions.  May I&amp;nbsp;ask&amp;nbsp;them?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Master&amp;nbsp;Git&amp;nbsp;nodded.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;How can I view a list of &lt;em&gt;all&lt;/em&gt;&amp;nbsp;tags?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git tag&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;How can I view a list of &lt;em&gt;all&lt;/em&gt;&amp;nbsp;remotes?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git remote -v&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;How can I view a list of &lt;em&gt;all&lt;/em&gt;&amp;nbsp;branches?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git branch -a&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;And how can I view the&amp;nbsp;current&amp;nbsp;branch?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git rev-parse --abbrev-ref HEAD&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;How can I delete&amp;nbsp;a&amp;nbsp;remote?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git remote rm&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;And how can I delete&amp;nbsp;a&amp;nbsp;branch?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;git branch -d&lt;/code&gt;&amp;#8220;, replied&amp;nbsp;Master&amp;nbsp;Git.&lt;/p&gt;
&lt;p&gt;The novice thought for a few moments, then asked: &amp;#8220;Surely some of these could be
made more consistent, so as to be easier to remember in the heat&amp;nbsp;of&amp;nbsp;coding?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Master Git snapped his fingers.  A hobgoblin entered the room and ate the novice
alive.  In the afterlife, the novice&amp;nbsp;was&amp;nbsp;enlightened.&lt;/p&gt;
&lt;h2 id="the-long-and-short-of-it"&gt;The Long and Short&amp;nbsp;of&amp;nbsp;It&lt;/h2&gt;
&lt;p&gt;Master Git and a novice were walking along&amp;nbsp;a&amp;nbsp;bridge.&lt;/p&gt;
&lt;p&gt;The novice, wanting to partake of Master Git&amp;#8217;s vast knowledge, said:
&amp;#8220;&lt;code&gt;git branch --help&lt;/code&gt;&amp;#8220;.&lt;/p&gt;
&lt;p&gt;Master Git sat down and lectured her on the seven forms of &lt;code&gt;git branch&lt;/code&gt;, and
their&amp;nbsp;many&amp;nbsp;options.&lt;/p&gt;
&lt;p&gt;They resumed walking.  A few minutes later they encountered an experienced
developer traveling in the opposite direction.  He bowed to Master Git and said
&amp;#8220;&lt;code&gt;git branch -h&lt;/code&gt;&amp;#8220;.  Master Git tersely informed him of the most common &lt;code&gt;git
branch&lt;/code&gt; options.  The developer thanked him and continued on&amp;nbsp;his&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Master,&amp;#8221; said the novice, &amp;#8220;what is the nature of long and short options for
commands?  I thought they were equivalent, but when that developer used &lt;code&gt;-h&lt;/code&gt; you
said something different than when I said &lt;code&gt;--help&lt;/code&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;Perspective is everything,&amp;#8221; answered&amp;nbsp;the&amp;nbsp;Master.&lt;/p&gt;
&lt;p&gt;The novice was puzzled.  She decided to experiment and said &amp;#8220;&lt;code&gt;git -h branch&lt;/code&gt;&amp;#8220;.&lt;/p&gt;
&lt;p&gt;Master Git turned and threw himself off the railing, falling to his death on the&amp;nbsp;rocks&amp;nbsp;below.&lt;/p&gt;
&lt;p&gt;Upon seeing this, the novice&amp;nbsp;was&amp;nbsp;enlightened.&lt;/p&gt;
                
            
                    
                &lt;img src="http://feeds.feedburner.com/~r/stevelosh/~4/YX7dnu5pLBk" height="1" width="1"/&gt;</content><feedburner:origLink>http://stevelosh.com/blog/2013/04/git-koans/</feedburner:origLink></entry><entry><title type="html">List Out of Lambda</title><author><name>Steve Losh</name></author><link href="http://feedproxy.google.com/~r/stevelosh/~3/9dpxA0m4m9U/" /><updated>2013-03-30T14:00:00Z</updated><published>2013-03-30T14:00:00Z</published><id>http://stevelosh.com/blog/2013/03/list-out-of-lambda/</id><content type="html">
                    
                        
                
                    &lt;p&gt;If you ignore the practical issues of computers like size, weight, cost, heat,
and so on, what do you &lt;em&gt;really&lt;/em&gt; need in a programming language?  Let&amp;#8217;s play
around with&amp;nbsp;this&amp;nbsp;question.&lt;/p&gt;
&lt;p&gt;To understand this post you&amp;#8217;ll need a basic understanding of how functions in
Javascript work.  If you can look at this code and understand what it prints,
you&amp;#8217;re good&amp;nbsp;to&amp;nbsp;go:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This blog post is a thought exercise.  It&amp;#8217;s not something you&amp;#8217;d ever use for
real code.  But just like a guitarist practices scales that she won&amp;#8217;t ever play
in a song, we programmers should be exercising our brains every&amp;nbsp;so&amp;nbsp;often.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m going to use Javascript for the examples.  Any language with first class
functions and lexical scoping (basically: closures) will work.  The examples
would be prettier in a Lisp, but some people would be turned off by the syntax
and miss out on some interesting ideas.  Feel free to port the code if it&amp;nbsp;bothers&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve already seen this kind of thing before (maybe you&amp;#8217;ve gone through &lt;a href="http://www.amazon.com/dp/0262560992/?tag=stelos-20"&gt;The
Little Schemer&lt;/a&gt; or &lt;a href="http://www.amazon.com/dp/0070004846/?tag=stelos-20"&gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;SICP&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;) you may want to just skim the code here and look
for&amp;nbsp;anything&amp;nbsp;new.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;haven&amp;#8217;t&lt;/em&gt; seen anything like this, then you&amp;#8217;re in for a treat!  It&amp;#8217;s all
going to look extremely weird the first time you see it.  Go slowly and make
sure you understand each piece fully before moving on to the next.  These
concepts may be unintuitive, but they&amp;#8217;re built from very&amp;nbsp;simple&amp;nbsp;pieces.&lt;/p&gt;
&lt;p&gt;Finally: if you get stuck, don&amp;#8217;t worry.  Tracing out the execution of a function
on paper can be a good way to wrap your brain around it (I recommend investing
in a good lap desk for comfy reading and writing).  If that doesn&amp;#8217;t work, just
close the window and come back tomorrow.  Sometimes new concepts need a while to
rattle around in your brain before they click&amp;nbsp;into&amp;nbsp;place.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lists"&gt;Lists&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#list-out-of-if"&gt;List Out&amp;nbsp;of&amp;nbsp;If&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#but-where-is-the-data"&gt;But Where is&amp;nbsp;the&amp;nbsp;Data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#building-on-the-foundations"&gt;Building on the Foundations&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#map"&gt;map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#filter"&gt;filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#and-or-not"&gt;and,&amp;nbsp;or,&amp;nbsp;not&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#list-out-of-lambda"&gt;List Out&amp;nbsp;of&amp;nbsp;Lambda&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-brief-intermission"&gt;A&amp;nbsp;Brief&amp;nbsp;Intermission&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#numbers"&gt;Numbers&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-is-a-number"&gt;What is&amp;nbsp;a&amp;nbsp;Number?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#inc-dec"&gt;inc,&amp;nbsp;dec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#is_zero"&gt;is_zero&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#add"&gt;add&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sub"&gt;sub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mul-pow"&gt;mul,&amp;nbsp;pow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#is_equal"&gt;is_equal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#less_than-greater_than"&gt;less_than,&amp;nbsp;greater_than&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#div-mod"&gt;div,&amp;nbsp;mod&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#full-circle"&gt;Full Circle&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#nth"&gt;nth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#drop-take"&gt;drop,&amp;nbsp;take&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#slice"&gt;slice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#length"&gt;length&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="lists"&gt;Lists&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s get started.  One of the most common things we do as programmers is
grouping data together.  Javascript has &amp;#8220;arrays&amp;#8221; built in to the language&amp;nbsp;for&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Candice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;What if Javascript didn&amp;#8217;t come with arrays included?  Could we create them (or
something like&amp;nbsp;them)&amp;nbsp;ourselves?&lt;/p&gt;
&lt;p&gt;To answer this, let&amp;#8217;s think about the bare minimum we&amp;#8217;d need to &amp;#8220;bootstrap&amp;#8221;
something like an array.  There are a number of ways to do this, but we&amp;#8217;re going
to look at one&amp;nbsp;in&amp;nbsp;particular.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll call our array-like thing a &amp;#8220;list&amp;#8221;.  To make it work, we need&amp;nbsp;four&amp;nbsp;parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The concept of &amp;#8220;the&amp;nbsp;empty&amp;nbsp;list&amp;#8221;.&lt;/li&gt;
&lt;li&gt;A way to add an element to the front of&amp;nbsp;a&amp;nbsp;list.&lt;/li&gt;
&lt;li&gt;A way to take a list and get the&amp;nbsp;first&amp;nbsp;element.&lt;/li&gt;
&lt;li&gt;A way to take a list and get everything &lt;em&gt;but&lt;/em&gt; the&amp;nbsp;first&amp;nbsp;element.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If we have those four things, we can build on top of them to do anything else we
might want.  For example: to make a list of one item, you add that item to the
front of the&amp;nbsp;empty&amp;nbsp;list.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s narrow this down further.  There are lots of ways you could implement
those four things &amp;#8212; I&amp;#8217;m going to use functions.  Let&amp;#8217;s sketch out&amp;nbsp;an&amp;nbsp;outline:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here are the descriptions of each of&amp;nbsp;these&amp;nbsp;items.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;empty_list&lt;/code&gt; is a special value that represents a list of zero elements.
It can be anything, so for now we&amp;#8217;ll use &lt;code&gt;null&lt;/code&gt; (we&amp;#8217;ll revisit&amp;nbsp;this&amp;nbsp;later).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prepend(1, some_list)&lt;/code&gt; will return a new list that looks like the old one, but
with &lt;code&gt;1&lt;/code&gt; stuck onto the front of it.  So if we want to create a list of the
numbers &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt; we can say &lt;code&gt;prepend(1, prepend(2, empty_list))&lt;/code&gt; or &amp;#8220;prepend
one to the result of prepending 2 to the&amp;nbsp;empty&amp;nbsp;list&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;head(some_list)&lt;/code&gt; will return the first element in the list.  Calling it on the
empty list will be undefined, so we&amp;#8217;ll just be very careful not to&amp;nbsp;do&amp;nbsp;that!&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tail(some_list)&lt;/code&gt; will return a new list that&amp;#8217;s like the one we gave it, but
with the first element removed.  Again, calling this on an empty list will make&amp;nbsp;things&amp;nbsp;explode.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;is_empty(some_list)&lt;/code&gt; will return &lt;code&gt;true&lt;/code&gt; if the list given to it is the empty
list, and &lt;code&gt;false&lt;/code&gt; otherwise.&lt;/p&gt;
&lt;p&gt;Once we have those four functions (plus the special empty list value) we can
start building on top of them, so let&amp;#8217;s figure out how to&amp;nbsp;make&amp;nbsp;them!&lt;/p&gt;
&lt;h3 id="list-out-of-if"&gt;List Out&amp;nbsp;of&amp;nbsp;If&lt;/h3&gt;
&lt;p&gt;If you haven&amp;#8217;t seen anything like this before, you might think it&amp;#8217;s time to
start creating Javascript Objects.  That&amp;#8217;s certainly one way to&amp;nbsp;do&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Since this post is a thought experiment in what we actually &lt;em&gt;need&lt;/em&gt;, though,
let&amp;#8217;s try to avoid using big language features (like Objects) unless we
absolutely can&amp;#8217;t&amp;nbsp;avoid&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;So if we don&amp;#8217;t want to use other language features yet, what are we left with?
Well so far our skeleton only has functions (and &lt;code&gt;null&lt;/code&gt;), so let&amp;#8217;s&amp;nbsp;try&amp;nbsp;those!&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the first working revision of the building blocks&amp;nbsp;of&amp;nbsp;lists:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Go ahead and paste that into a browser console and play&amp;nbsp;with&amp;nbsp;it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Candice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// False&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Alice&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Some function representing the list of (&amp;quot;Bob&amp;quot;, &amp;quot;Candice&amp;quot;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="c1"&gt;// Bob&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="but-where-is-the-data"&gt;But Where is&amp;nbsp;the&amp;nbsp;Data?&lt;/h3&gt;
&lt;p&gt;Did the definitions of those functions surprise you?  Lists seem like such an
important, object-oriented concept, but there only appear to be&amp;nbsp;functions&amp;nbsp;here!&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at how this actually works.  First of all, the &amp;#8220;empty list&amp;#8221; concept
is&amp;nbsp;pretty&amp;nbsp;straightforward:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We could have picked any arbitrary value here.  &lt;code&gt;null&lt;/code&gt; seemed appropriate, so
I&amp;nbsp;used&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;Now on to the meat of things: &lt;code&gt;prepend&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is where the real magic happens.  Let&amp;#8217;s think&amp;nbsp;through&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;First of all, we know that when you prepend something to a list, you&amp;#8217;re going to
get a (new) list back.  So whatever &lt;code&gt;prepend&lt;/code&gt; returns must be&amp;nbsp;a&amp;nbsp;list.&lt;/p&gt;
&lt;p&gt;Looking at the code, we can see it returns a function.  So in our little thought
experiment, a list is actually a Javascript function under&amp;nbsp;the&amp;nbsp;hood!&lt;/p&gt;
&lt;p&gt;So what do we need to do with lists (aside from empty checking, which we&amp;#8217;ve
already covered)?  Well, we need to be able to get the head and the tail.  When
we call &lt;code&gt;prepend(h, t)&lt;/code&gt;, we happen to be conveniently specifying the head and
tail as the arguments!  So in &lt;code&gt;prepend&lt;/code&gt; we return a function that knows how to
return its own head or tail&amp;nbsp;when&amp;nbsp;asked.&lt;/p&gt;
&lt;p&gt;So a &amp;#8220;list&amp;#8221; is &amp;#8220;a function that knows how to return its own head or tail when
asked&amp;#8221;.  So our &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; functions just need to&amp;nbsp;ask&amp;nbsp;nicely!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;That&amp;#8217;s it!  We&amp;#8217;ve created lists in 23 lines of code without using any fancy
things like Objects.  Before you move on, make sure you really understand why
this works.  Write out a few examples&amp;nbsp;on&amp;nbsp;paper.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="building-on-the-foundations"&gt;Building on&amp;nbsp;the&amp;nbsp;Foundations&lt;/h3&gt;
&lt;p&gt;Now that we have lists, let&amp;#8217;s implement a few common things on top of them&amp;nbsp;as&amp;nbsp;practice.&lt;/p&gt;
&lt;h4 id="map"&gt;map&lt;/h4&gt;
&lt;p&gt;A common thing to do to a list is to create a new list by looping through it and
doing something to each item.  This is&amp;nbsp;called&amp;nbsp;&amp;#8220;map&amp;#8221;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you&amp;#8217;re not used to recursive definitions like this, you may way to take
a few minutes and try to work out how it works.  Here&amp;#8217;s&amp;nbsp;an&amp;nbsp;example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;squared_numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;square&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// map(square, [1, 2, 3])&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), map(square, [1, 2, 3]))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(square(2), map(square, [3])))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(square(2), prepend(square(3), map(square, []))))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(square(2), prepend(square(3), [])))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(square(2), prepend(9, [])))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(square(2), [9]))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), prepend(4, [9]))&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(square(1), [4, 9])&lt;/span&gt;
&lt;span class="c1"&gt;// prepend(1, [4, 9])&lt;/span&gt;
&lt;span class="c1"&gt;// [1, 4, 9]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I&amp;#8217;m using brackets here to represent lists, but remember that these aren&amp;#8217;t
arrays, but are actually the functions that were returned by &lt;code&gt;prepend&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re still not sure about this, trace out every step of &lt;code&gt;map(square,
empty_list)&lt;/code&gt; on paper.  Then trace out every step of &lt;code&gt;map(square, prepend(10,
empty_list))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Thinking recursively like this takes some practice.  I have notebooks filled
with &lt;a href="http://i.imgur.com/kqu5jy9.jpg"&gt;pages like this&lt;/a&gt;.  Experienced guitarists
practice new material slowly and methodically &amp;#8212; there&amp;#8217;s no reason programmers
shouldn&amp;#8217;t do the same.  Watching the function calls expand and contract on paper
can help you feel in your gut how these things work in a way that just staring
at the&amp;nbsp;words&amp;nbsp;can&amp;#8217;t.&lt;/p&gt;
&lt;h4 id="filter"&gt;filter&lt;/h4&gt;
&lt;p&gt;We&amp;#8217;re going to start moving a bit faster now, but you should still make sure you
understand everything completely before moving on.  Take as much time as you
need.  Write things out.  Run them.  Get a feel&amp;nbsp;for&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;The next &amp;#8220;utility&amp;#8221; function we&amp;#8217;ll build on top of lists is &lt;code&gt;filter&lt;/code&gt;, which
takes a function and a list, and returns a new list whose elements are those in
the original that make the function return &lt;code&gt;true&lt;/code&gt;.  Here&amp;#8217;s&amp;nbsp;an&amp;nbsp;example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_odd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_odd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// [1, 3]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now let&amp;#8217;s implement &lt;code&gt;filter&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Take your time.  Trace out some examples.  Move on when you feel it in&amp;nbsp;your&amp;nbsp;gut.&lt;/p&gt;
&lt;h4 id="and-or-not"&gt;and,&amp;nbsp;or,&amp;nbsp;not&lt;/h4&gt;
&lt;p&gt;Let&amp;#8217;s take a slight detour to implement a few &amp;#8220;helper&amp;#8221; functions.  Τhese don&amp;#8217;t
have anything specifically to do with lists, but we&amp;#8217;ll need&amp;nbsp;them&amp;nbsp;later.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Javascript already has these things built in as &lt;code&gt;!&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, and &lt;code&gt;||&lt;/code&gt;, of course,
but remember that in this thought exercise we&amp;#8217;re trying to avoid using extra
language features if we don&amp;#8217;t need them.  How far can we scrape by on just
functions and &lt;code&gt;if&lt;/code&gt; statements?&lt;/p&gt;
&lt;p&gt;One small note: these functions are just normal Javascript functions, which
means that &lt;code&gt;and(a, b)&lt;/code&gt; will &lt;em&gt;not&lt;/em&gt; short-circuit like &lt;code&gt;a &amp;amp;&amp;amp; b&lt;/code&gt; would.  For our
purposes here that won&amp;#8217;t hurt us, but it&amp;#8217;s something to be&amp;nbsp;aware&amp;nbsp;of.&lt;/p&gt;
&lt;h3 id="list-out-of-lambda"&gt;List Out&amp;nbsp;of&amp;nbsp;Lambda&lt;/h3&gt;
&lt;p&gt;Now that we&amp;#8217;ve had a bit more practice, let&amp;#8217;s go back to our definition&amp;nbsp;of&amp;nbsp;lists:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There are a few things about this implementation that bother me.  Our goal is to
use as few language features as possible, but we&amp;#8217;ve actually used quite a few!
I count at&amp;nbsp;least&amp;nbsp;five:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if&lt;/code&gt; statements&lt;/li&gt;
&lt;li&gt;Strings&lt;/li&gt;
&lt;li&gt;Booleans (the &lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt; result of &lt;code&gt;is_empty&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Equality checking (the &lt;code&gt;===&lt;/code&gt; checks)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It turns out we can remove most of those things at the cost of a bit of
readability (and more bending of&amp;nbsp;our&amp;nbsp;minds).&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start by rewriting the core three functions to ditch those ugly strings,
equality checks, and even the &lt;code&gt;if&lt;/code&gt; statement:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You may want to get a snack before wrapping your brain around this one!  There&amp;#8217;s
no strings, no equality checking, no &lt;code&gt;if&lt;/code&gt; statements.  But we still&amp;nbsp;have&amp;nbsp;lists!&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;prepend&lt;/code&gt; functions still returns a function, just like before.  Remember
that in the last implementation, a &amp;#8220;list&amp;#8221; was really a function that knew how to
give out its head or its tail when asked&amp;nbsp;for&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;This time, we&amp;#8217;re inverting the &amp;#8220;asking&amp;#8221;.  In this version, a &amp;#8220;list&amp;#8221; is &amp;#8220;a
function that will tell another function about both its head &lt;em&gt;and&lt;/em&gt; its tail when
asked&amp;#8221;.  This time the &lt;em&gt;asker&lt;/em&gt; gets &lt;em&gt;both&lt;/em&gt; pieces, and can decide which one they
want&amp;nbsp;to&amp;nbsp;use.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at the &lt;code&gt;head&lt;/code&gt; function:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;head&lt;/code&gt; takes a list and says &lt;code&gt;return list(...)&lt;/code&gt;, which means: &amp;#8220;Hey list,
  I would like you to tell all of your info to this little helper function I&amp;#8217;m&amp;nbsp;giving&amp;nbsp;you&amp;#8221;.&lt;/li&gt;
&lt;li&gt;The list says &lt;code&gt;return ...(el, list)&lt;/code&gt;, which means: &amp;#8220;Okay helper function,
  here&amp;#8217;s my head and my&amp;nbsp;tail,&amp;nbsp;enjoy!&amp;#8221;&lt;/li&gt;
&lt;li&gt;The helper function that &lt;code&gt;head&lt;/code&gt; originally gave was &lt;code&gt;function(h, t) { return
  h; }&lt;/code&gt;.  So when the list calls it with the head and the tail as arguments, it
  returns the head and ignores&amp;nbsp;the&amp;nbsp;tail.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;head&lt;/code&gt; takes that result and just returns it straight through back to&amp;nbsp;the&amp;nbsp;caller.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;tail&lt;/code&gt; works exactly the same way, but its helper function returns the second
argument (the tail) instead of&amp;nbsp;the&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s it!  The equality checking and &lt;code&gt;if&lt;/code&gt; statements have disappeared.  Can you
describe where they&amp;#8217;ve gone?  What has taken&amp;nbsp;their&amp;nbsp;place?&lt;/p&gt;
&lt;p&gt;Before we move on, let&amp;#8217;s clean up the idea of the empty list.  It&amp;#8217;s still using
&lt;code&gt;null&lt;/code&gt; and equality checking.  Let&amp;#8217;s remove those and make things a little&amp;nbsp;more&amp;nbsp;uniform.&lt;/p&gt;
&lt;p&gt;To do this we&amp;#8217;ll need to change the other three functions a bit as well, but if
you&amp;#8217;ve understood everything so far it shouldn&amp;#8217;t be&amp;nbsp;too&amp;nbsp;bad.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We&amp;#8217;ve now made lists a bit smarter.  In addition to telling the helper function
their head and tail, they also tell it &amp;#8220;am I the empty list?&amp;#8221;.  We&amp;#8217;ve modified
the helpers &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; to accept (and ignore) this&amp;nbsp;extra&amp;nbsp;argument.&lt;/p&gt;
&lt;p&gt;We then modified &lt;code&gt;is_empty&lt;/code&gt; to work just like &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, we&amp;#8217;ve redefined &lt;code&gt;empty_list&lt;/code&gt; to match the rest of the lists instead of
being a special, magic value.  The empty list is now just like a normal one:
it&amp;#8217;s a function that takes an &amp;#8220;asker&amp;#8221; and tells that asker &amp;#8220;Hey, my head and
tail are undefined and I am the&amp;nbsp;empty&amp;nbsp;list&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I used &lt;code&gt;undefined&lt;/code&gt; here which is technically another language feature because
it&amp;#8217;s easier to read.  Feel free to replace it with anything you want to make it
more pure.  Since we&amp;#8217;re being very careful to never call &lt;code&gt;head&lt;/code&gt; or &lt;code&gt;tail&lt;/code&gt; on the
empty list those values will never be&amp;nbsp;seen&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;So after all that, we&amp;#8217;ve finally implemented the building blocks of lists with
only&amp;nbsp;two&amp;nbsp;things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Functions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt; for&amp;nbsp;empty&amp;nbsp;lists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#8217;re up for a challenge, think about whether you could remove that second
item (and if so, are you &lt;em&gt;really&lt;/em&gt; removing it, or just using certain features of
Javascript implicitly instead&amp;nbsp;of&amp;nbsp;explicitly?).&lt;/p&gt;
&lt;h2 id="a-brief-intermission"&gt;A&amp;nbsp;Brief&amp;nbsp;Intermission&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s take a minute to reflect on all the code we&amp;#8217;ve seen so far.  First, we
have an implementation of lists that uses only functions&amp;nbsp;and&amp;nbsp;booleans:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;From this point on, we can now ignore the details of how lists are implemented.
As long as we have &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, and &lt;code&gt;prepend&lt;/code&gt; we don&amp;#8217;t need to worry about
what lists actually &lt;em&gt;are&lt;/em&gt; under&amp;nbsp;the&amp;nbsp;hood.&lt;/p&gt;
&lt;p&gt;We also built a few helper functions on top of&amp;nbsp;this&amp;nbsp;foundation:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Before you move on, make sure all of this code is crystal clear.  Come back
tomorrow if you need to let it sink in.  We&amp;#8217;re about to go a lot deeper into the
rabbit hole, so make sure&amp;nbsp;you&amp;#8217;re&amp;nbsp;ready.&lt;/p&gt;
&lt;h2 id="numbers"&gt;Numbers&lt;/h2&gt;
&lt;p&gt;If you look at the definitions of &lt;code&gt;prepend&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, and &lt;code&gt;tail&lt;/code&gt;, they&amp;#8217;re pretty
mind-bending.  However, the definitions of &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt; are much&amp;nbsp;more&amp;nbsp;straightforward.&lt;/p&gt;
&lt;p&gt;This is because we encapsulated the implementation of lists into the first four
functions.  We did all the hard work of building lists out of almost nothing at
all and hid it behind that simple &lt;code&gt;prepend&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, and &lt;code&gt;tail&lt;/code&gt; interface.&lt;/p&gt;
&lt;p&gt;The idea of creating things from simple pieces and abstracting them into &amp;#8220;black
boxes&amp;#8221; is one of the most important parts of both computer science and
programming, so let&amp;#8217;s take it a step further and get some more practice by&amp;nbsp;implementing&amp;nbsp;numbers.&lt;/p&gt;
&lt;h3 id="what-is-a-number"&gt;What is&amp;nbsp;a&amp;nbsp;Number?&lt;/h3&gt;
&lt;p&gt;For this blog post we&amp;#8217;re only going to concern ourselves with non-negative
integers.  Feel free to try extending all this to include negative integers if
you&amp;nbsp;want&amp;nbsp;more.&lt;/p&gt;
&lt;p&gt;How can we represent a number?  Well we could obviously use Javascript numbers
like &lt;code&gt;14&lt;/code&gt;, but that&amp;#8217;s not very fun, and we&amp;#8217;re trying to minimize the number of
language features&amp;nbsp;we&amp;nbsp;use.&lt;/p&gt;
&lt;p&gt;One way to represent a number is a list whose length is the number.  So we could
say that &lt;code&gt;[1, 1, 1]&lt;/code&gt; means &amp;#8220;three&amp;#8221;, &lt;code&gt;["cats", null]&lt;/code&gt; means &amp;#8220;two&amp;#8221;, and &lt;code&gt;[]&lt;/code&gt; means&amp;nbsp;&amp;#8220;zero&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The elements themselves don&amp;#8217;t really matter, so let&amp;#8217;s just pick something we
already have: the empty list!  Let&amp;#8217;s write out a few to get a feel&amp;nbsp;for&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// []&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// [ [] ]&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;two&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// [ [], [] ]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="inc-dec"&gt;inc,&amp;nbsp;dec&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;re going to want to &lt;em&gt;do&lt;/em&gt; things with our numbers, so let&amp;#8217;s start writing
things that work with this &amp;#8220;list of things&amp;#8221; representation&amp;nbsp;of&amp;nbsp;numbers.&lt;/p&gt;
&lt;p&gt;Our basic building blocks are going to be &lt;code&gt;inc&lt;/code&gt; and &lt;code&gt;dec&lt;/code&gt; (increment&amp;nbsp;and&amp;nbsp;decrement).&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;inc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To add 1 to a number, we just push another element on the list.  So
&lt;code&gt;inc(inc(zero))&lt;/code&gt; means&amp;nbsp;&amp;#8220;two&amp;#8221;.&lt;/p&gt;
&lt;p&gt;To subtract 1, we just pop off one of the elements: &lt;code&gt;dec(two)&lt;/code&gt; means &amp;#8220;one&amp;#8221;
(remember we&amp;#8217;re ignoring&amp;nbsp;negative&amp;nbsp;numbers).&lt;/p&gt;
&lt;h3 id="is_zero"&gt;is_zero&lt;/h3&gt;
&lt;p&gt;When we started working with lists we used &lt;code&gt;is_empty&lt;/code&gt; a lot, so it&amp;#8217;s probably
a good idea to create an &lt;code&gt;is_zero&lt;/code&gt; function at&amp;nbsp;this&amp;nbsp;point:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Zero is just represented by the empty list, so this one&amp;nbsp;is&amp;nbsp;easy!&lt;/p&gt;
&lt;h3 id="add"&gt;add&lt;/h3&gt;
&lt;p&gt;Adding one is easy, but we&amp;#8217;re probably going to want to add arbitrary numbers
together.  Now that we have &lt;code&gt;inc&lt;/code&gt; and &lt;code&gt;dec&lt;/code&gt; this is actually&amp;nbsp;pretty&amp;nbsp;easy:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is another recursive definition.  When adding two numbers, there are&amp;nbsp;two&amp;nbsp;possibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;b&lt;/code&gt; is zero, then anything plus zero is zero, so we can just return &lt;code&gt;a&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Otherwise, adding &lt;code&gt;a + b&lt;/code&gt; is the same as adding &lt;code&gt;(a + 1) + (b - 1)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eventually &lt;code&gt;b&lt;/code&gt; will &amp;#8220;bottom out&amp;#8221; and return &lt;code&gt;a&lt;/code&gt; (which has been steadily getting
bigger as &lt;code&gt;b&lt;/code&gt; got&amp;nbsp;smaller).&lt;/p&gt;
&lt;p&gt;Notice how we didn&amp;#8217;t say anything about lists here!  The &amp;#8220;numbers are lists
under the hood&amp;#8221; idea has been encapsulated behind &lt;code&gt;is_zero&lt;/code&gt;, &lt;code&gt;inc&lt;/code&gt;, and &lt;code&gt;dec&lt;/code&gt;,
so we can ignore it and work at the &amp;#8220;number&amp;#8221; level of abstraction from here&amp;nbsp;on&amp;nbsp;out.&lt;/p&gt;
&lt;h3 id="sub"&gt;sub&lt;/h3&gt;
&lt;p&gt;Subtraction is similar to addition, but instead of &lt;em&gt;increasing&lt;/em&gt; &lt;code&gt;a&lt;/code&gt; as &lt;code&gt;b&lt;/code&gt; gets
smaller, we &lt;em&gt;decrease&lt;/em&gt; them&amp;nbsp;both&amp;nbsp;together:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now we can say something like &lt;code&gt;add(two, sub(three, two))&lt;/code&gt; and the result will be
a representation of &amp;#8220;three&amp;#8221; in our system (which, of course, is a list of&amp;nbsp;three&amp;nbsp;elements).&lt;/p&gt;
&lt;p&gt;Pause for a minute now and remember that underneath numbers are lists, and
underneath lists there&amp;#8217;s nothing but functions.  We can add and subtract
integers and underneath it all it&amp;#8217;s just functions shuffling around, expanding
into other functions and contracting as they&amp;#8217;re called, and this writhing mass
of lambdas somehow ends up representing &lt;code&gt;1 + 1 = 2&lt;/code&gt;.  That&amp;#8217;s&amp;nbsp;pretty&amp;nbsp;cool!&lt;/p&gt;
&lt;h3 id="mul-pow"&gt;mul,&amp;nbsp;pow&lt;/h3&gt;
&lt;p&gt;For practice let&amp;#8217;s create a way to&amp;nbsp;multiply&amp;nbsp;numbers:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mul&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Building on &lt;code&gt;add&lt;/code&gt; makes this pretty easy.  &lt;code&gt;3 * 4&lt;/code&gt; is the same as &lt;code&gt;3
+ 3 + 3 + 3 + 0&lt;/code&gt;.  Trace out the execution on paper if things are starting to
get away from you.  Carry on when&amp;nbsp;you&amp;#8217;re&amp;nbsp;ready.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pow&lt;/code&gt; (&amp;#8220;power&amp;#8221; or exponential) follows a similar structure as &lt;code&gt;mul&lt;/code&gt;, but instead
of adding together the copies we multiply them, and our base is one instead&amp;nbsp;of&amp;nbsp;zero:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;one&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="is_equal"&gt;is_equal&lt;/h3&gt;
&lt;p&gt;A common thing to do with numbers is to check if two are equal, so let&amp;#8217;s&amp;nbsp;write&amp;nbsp;that:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;is_equal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;is_equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There are three&amp;nbsp;cases&amp;nbsp;here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If both numbers are zero, they&amp;nbsp;are&amp;nbsp;equal.&lt;/li&gt;
&lt;li&gt;If only one number is zero (but not both, or the first case would have caught
  it), then they are &lt;em&gt;not&lt;/em&gt;&amp;nbsp;equal.&lt;/li&gt;
&lt;li&gt;Otherwise, subtract one from each and&amp;nbsp;try&amp;nbsp;again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When calling this function with two non-zero numbers, both will be decremented
in tandem until one of them bottoms out at zero first, or until they bottom out
at the&amp;nbsp;same&amp;nbsp;time.&lt;/p&gt;
&lt;h3 id="less_than-greater_than"&gt;less_than,&amp;nbsp;greater_than&lt;/h3&gt;
&lt;p&gt;We can take a similar approach to implementing &lt;code&gt;less_than&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;less_than&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;less_than&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The difference here is that we have&amp;nbsp;four&amp;nbsp;cases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If both numbers are zero, then &lt;code&gt;a&lt;/code&gt; is not less than &lt;code&gt;b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Otherwise if &lt;code&gt;a&lt;/code&gt; is zero (and we know &lt;code&gt;b&lt;/code&gt; isn&amp;#8217;t) then yes, &lt;code&gt;a&lt;/code&gt; is less than
  &lt;code&gt;b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Otherwise if &lt;code&gt;b&lt;/code&gt; is zero (and we know that &lt;code&gt;a&lt;/code&gt; isn&amp;#8217;t) then no, &lt;code&gt;a&lt;/code&gt; cannot be
  less than &lt;code&gt;b&lt;/code&gt; (remember that we&amp;#8217;re ignoring&amp;nbsp;negative&amp;nbsp;numbers).&lt;/li&gt;
&lt;li&gt;Otherwise decrement both and&amp;nbsp;try&amp;nbsp;again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once again, both numbers race to bottom out, and the outcome is decided by which
one bottoms&amp;nbsp;out&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;We could do something similar for &lt;code&gt;greater_than&lt;/code&gt;, but let&amp;#8217;s do it the easy&amp;nbsp;way&amp;nbsp;instead:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;greater_than&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;less_than&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="div-mod"&gt;div,&amp;nbsp;mod&lt;/h3&gt;
&lt;p&gt;Once we have &lt;code&gt;less_than&lt;/code&gt; we&amp;#8217;re ready to implement division&amp;nbsp;and&amp;nbsp;remainders:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;less_than&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;rem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;less_than&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This pair is a bit more complicated than the three other basic operations
because we can&amp;#8217;t deal with negative numbers.  Make sure you understand how&amp;nbsp;it&amp;nbsp;works.&lt;/p&gt;
&lt;h2 id="full-circle"&gt;Full&amp;nbsp;Circle&lt;/h2&gt;
&lt;p&gt;At this point, we have a (very basic) working system of numbers built on top of
lists.  Let&amp;#8217;s chase our tails a bit and implement a few more list functions that&amp;nbsp;use&amp;nbsp;numbers.&lt;/p&gt;
&lt;h3 id="nth"&gt;nth&lt;/h3&gt;
&lt;p&gt;To get the Nth item in a list, we just pop things off of it as we decrement
N until we&amp;nbsp;hit&amp;nbsp;zero:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;nth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;nth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Under the hood there are really &lt;em&gt;two&lt;/em&gt; lists getting things popped off as we
iterate, because &lt;code&gt;n&lt;/code&gt; is a number, which is a list, and &lt;code&gt;dec&lt;/code&gt; pops things off.
But it&amp;#8217;s much easier to read when we&amp;#8217;ve abstracted away the representation of
numbers, don&amp;#8217;t&amp;nbsp;you&amp;nbsp;think?&lt;/p&gt;
&lt;h3 id="drop-take"&gt;drop,&amp;nbsp;take&lt;/h3&gt;
&lt;p&gt;Two handy functions for working with lists are &lt;code&gt;drop&lt;/code&gt; and &lt;code&gt;take&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;drop(l, three)&lt;/code&gt; will return the list with the first three&amp;nbsp;elements&amp;nbsp;removed.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;take(l, three)&lt;/code&gt; will return the list containing only the first&amp;nbsp;three&amp;nbsp;elements.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;drop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;take&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;dec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="slice"&gt;slice&lt;/h3&gt;
&lt;p&gt;Slicing a list is easy now that we have &lt;code&gt;drop&lt;/code&gt;, &lt;code&gt;take&lt;/code&gt;, and the ability to&amp;nbsp;subtract&amp;nbsp;numbers:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;slice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;First we drop up to the start, then take enough to get us to&amp;nbsp;the&amp;nbsp;end.&lt;/p&gt;
&lt;h3 id="length"&gt;length&lt;/h3&gt;
&lt;p&gt;We can define &lt;code&gt;length&lt;/code&gt; recursively like&amp;nbsp;everything&amp;nbsp;else:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The length of the empty list is zero, and the length of any non-empty list is
one plus the length of&amp;nbsp;its&amp;nbsp;tail.&lt;/p&gt;
&lt;p&gt;If your mind isn&amp;#8217;t in knots by this point, consider&amp;nbsp;the&amp;nbsp;following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lists are made&amp;nbsp;of&amp;nbsp;functions.&lt;/li&gt;
&lt;li&gt;Numbers are made of lists whose length represents&amp;nbsp;the&amp;nbsp;number.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;length&lt;/code&gt; is a function that takes a list (which is a function) and returns
  the length as a number (a list whose length represents&amp;nbsp;the&amp;nbsp;number).&lt;/li&gt;
&lt;li&gt;We only just now got around to defining &lt;code&gt;length&lt;/code&gt; even though we&amp;#8217;ve been using
  numbers (which use the &lt;em&gt;length&lt;/em&gt; of a list to represent a number) for a&amp;nbsp;while&amp;nbsp;now!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Are you dizzy yet?&amp;nbsp;If&amp;nbsp;not:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mylist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="nx"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="nx"&gt;empty_list&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mylistlength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mylist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;mylist&lt;/code&gt; is a list of two&amp;nbsp;empty&amp;nbsp;lists.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mylistlength&lt;/code&gt; is the length of &lt;code&gt;mylist&lt;/code&gt;&amp;#8230;&lt;br /&gt;
which is &amp;#8220;two&amp;#8221;&amp;#8230;&lt;br /&gt;
which is represented by a list of two empty lists&amp;#8230;&lt;br /&gt;
which is &lt;code&gt;mylist&lt;/code&gt; itself!&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you liked this twisty little story, I highly recommend you check out &lt;a href="http://www.amazon.com/dp/0262560992/?tag=stelos-20"&gt;The
Little Schemer&lt;/a&gt;.  It was one of the first books that really changed how
I thought about programming.  Don&amp;#8217;t be put off by the fact that it uses Scheme
&amp;#8212; the language doesn&amp;#8217;t&amp;nbsp;really&amp;nbsp;matter.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also created &lt;a href="https://gist.github.com/sjl/5277681"&gt;a gist&lt;/a&gt; with all the code.  Feel free to fork it and use it&amp;nbsp;for&amp;nbsp;practice.&lt;/p&gt;
&lt;p&gt;You could add some more utility functions for practice&amp;nbsp;writing&amp;nbsp;recursively:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;append&lt;/code&gt; to add an item to the end of&amp;nbsp;a&amp;nbsp;list.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;concat&lt;/code&gt; to concatenate&amp;nbsp;two&amp;nbsp;lists.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; which take two numbers and return the&amp;nbsp;minimum/maximum&amp;nbsp;one.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove&lt;/code&gt;, which is like filter except it only leaves the elements that return
  &lt;code&gt;false&lt;/code&gt; for&amp;nbsp;the&amp;nbsp;predicate.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contains_number&lt;/code&gt;, which checks if a specific number is inside a list&amp;nbsp;of&amp;nbsp;numbers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or if you want something more challenging, try implementing bigger concepts on
top of the&amp;nbsp;current&amp;nbsp;ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Negative&amp;nbsp;numbers.&lt;/li&gt;
&lt;li&gt;Non-negative&amp;nbsp;rational&amp;nbsp;numbers.&lt;/li&gt;
&lt;li&gt;Negative&amp;nbsp;rational&amp;nbsp;numbers.&lt;/li&gt;
&lt;li&gt;Association lists (a data structure that associates keys&amp;nbsp;with&amp;nbsp;values).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember: the point is not to create something that runs well on a physical
computer.  Instead of thinking about how to make a particular combination of
transistors and circuits have the right voltages, think about &amp;#8220;computing&amp;#8221; in the
beautiful, perfect,&amp;nbsp;abstract&amp;nbsp;sense.&lt;/p&gt;
                
            
                    
                &lt;img src="http://feeds.feedburner.com/~r/stevelosh/~4/9dpxA0m4m9U" height="1" width="1"/&gt;</content><feedburner:origLink>http://stevelosh.com/blog/2013/03/list-out-of-lambda/</feedburner:origLink></entry><entry><title type="html">The Caves of Clojure: Part 7.1</title><author><name>Steve Losh</name></author><link href="http://feedproxy.google.com/~r/stevelosh/~3/lVjWK3q5JiI/" /><updated>2012-10-15T09:50:00Z</updated><published>2012-10-15T09:50:00Z</published><id>http://stevelosh.com/blog/2012/10/caves-of-clojure-07-1/</id><content type="html">
                    
                        
                
                    &lt;p&gt;This post is part of an ongoing series.  If you haven&amp;#8217;t already done so, you
should probably start at &lt;a href="/blog/2012/07/caves-of-clojure-01/"&gt;the beginning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This entry corresponds to the beginning of &lt;a href="http://trystans.blogspot.com/2011/09/roguelike-tutorial-07-z-levels-and.html"&gt;post seven in Trystan&amp;#8217;s
tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to follow along, the code for the series is &lt;a href="http://bitbucket.org/sjl/caves/"&gt;on Bitbucket&lt;/a&gt; and
&lt;a href="http://github.com/sjl/caves/"&gt;on GitHub&lt;/a&gt;.  Update to the &lt;code&gt;entry-07-1&lt;/code&gt; tag to see the code as it stands
after&amp;nbsp;this&amp;nbsp;post.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a while since the last post, but I&amp;#8217;ve been taking care of things and
hopefully should be able to write a bit&amp;nbsp;more&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;This post is going to be short.  It&amp;#8217;ll cover a relatively self-contained but
interesting bit of Trystan&amp;#8217;s seventh post.  The rest of it will be covered in
the&amp;nbsp;next&amp;nbsp;entry.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#region-mapping"&gt;Region&amp;nbsp;Mapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#visualization"&gt;Visualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#results"&gt;Results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;In Trystan&amp;#8217;s seventh post he adds vertical levels and stairs connecting them.
I&amp;#8217;m going to cover the first part of that now: mapping&amp;nbsp;out&amp;nbsp;regions.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s been a bit of refactoring since my last post which I&amp;#8217;m not going to
cover.  If you want to see what changed, diff the tags in your &lt;span class="caps"&gt;&lt;span class="caps"&gt;VCS&lt;/span&gt;&lt;/span&gt;&amp;nbsp;of&amp;nbsp;choice.&lt;/p&gt;
&lt;h2 id="region-mapping"&gt;Region&amp;nbsp;Mapping&lt;/h2&gt;
&lt;p&gt;In order to decide where to place stairs, Trystan maps out &amp;#8220;regions&amp;#8221; of
contiguous, walkable tiles after he generates and smooths the world.  I&amp;#8217;m going
to do the&amp;nbsp;same&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;My goal is to create a &amp;#8220;region map&amp;#8221;, which is a map of coordinates to region
numbers.  For example, consider the following tiny&amp;nbsp;world&amp;nbsp;map:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;..##..
..#...
..#.##
..#.#.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There are three distinct regions in&amp;nbsp;this&amp;nbsp;map:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;11##22
11#222
11#2##
11#2#3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So the region map would&amp;nbsp;look&amp;nbsp;like:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;; x y  region&lt;/span&gt;
&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
 &lt;span class="nv"&gt;...&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This makes it easy to tell which region a particular tile is in&amp;nbsp;(if&amp;nbsp;any).&lt;/p&gt;
&lt;p&gt;As usual, I&amp;#8217;ll start with a few helper functions.  These two functions are just
for convenience&amp;nbsp;and&amp;nbsp;readability:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def &lt;/span&gt;&lt;span class="nv"&gt;all-coords&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;cols&lt;/span&gt; &lt;span class="nv"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;world-size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;for &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="nv"&gt;cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="nv"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;get-tile-from-level&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-in&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:bound&lt;/span&gt; &lt;span class="nv"&gt;tiles&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;all-coords&lt;/code&gt; function simply returns a lazy sequence of &lt;code&gt;[x y]&lt;/code&gt; coordinates
representing every coordinate in&amp;nbsp;a&amp;nbsp;level.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;get-tile-from-level&lt;/code&gt; encapsulates the act of pulling out a tile from a level
given an &lt;code&gt;[x y]&lt;/code&gt; coordinate.  This is helpful because of the way I&amp;#8217;m storing
tiles (note the ugly &lt;code&gt;[y x]&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Next up is a function that filters a set of coordinates to only contain those
that are actually walkable in the given level (i.e.: those that don&amp;#8217;t contain
a&amp;nbsp;wall&amp;nbsp;tile):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;filter-walkable&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Filter the given coordinates to include only walkable ones.&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;tile-walkable?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-tile-from-level&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
               &lt;span class="nv"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This uses the &lt;code&gt;get-tile-from-level&lt;/code&gt; function as well as &lt;code&gt;tile-walkable?&lt;/code&gt; from
&lt;code&gt;world.core&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next is a function to take a coordinate and return which of its neighboring
coordinates&amp;nbsp;are&amp;nbsp;walkable:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;walkable-neighbors&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Return the neighboring coordinates walkable from the given coord.&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;coord&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter-walkable&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;neighbors&lt;/span&gt; &lt;span class="nv"&gt;coord&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This one is almost trivial, but I like building up functions in small steps like
this because it&amp;#8217;s easier for me&amp;nbsp;to&amp;nbsp;read.&lt;/p&gt;
&lt;p&gt;Now we come to a function with a bit more meat.  This is the core of the &amp;#8220;flood
fill&amp;#8221; algorithm I&amp;#8217;m going to use to fill in the&amp;nbsp;region&amp;nbsp;map.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;walkable-from&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;Return all coordinates walkable from the given coord (including itself).&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;coord&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;loop &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;walked&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
         &lt;span class="nv"&gt;to-walk&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;coord&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt; &lt;span class="nv"&gt;to-walk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;walked&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first &lt;/span&gt;&lt;span class="nv"&gt;to-walk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;walked&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;conj &lt;/span&gt;&lt;span class="nv"&gt;walked&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;to-walk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;disj &lt;/span&gt;&lt;span class="nv"&gt;to-walk&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;candidates&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;walkable-neighbors&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;to-walk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;union &lt;/span&gt;&lt;span class="nv"&gt;to-walk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;difference &lt;/span&gt;&lt;span class="nv"&gt;candidates&lt;/span&gt; &lt;span class="nv"&gt;walked&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;recur&lt;/span&gt; &lt;span class="nv"&gt;walked&lt;/span&gt; &lt;span class="nv"&gt;to-walk&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In a nutshell, this function loops over two sets: &lt;code&gt;walked&lt;/code&gt; and &lt;code&gt;to-walk&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Each iteration it grabs a coordinate from &lt;code&gt;to-walk&lt;/code&gt; and sticks it into the
&lt;code&gt;walked&lt;/code&gt; set.  It then finds all the coordinates it can walk to from that
coordinate using a helper function.  It uses &lt;code&gt;clojure.set/difference&lt;/code&gt; to
determine which of those are new (i.e.: still need to be walked) and sticks them
into the &lt;code&gt;to-walk&lt;/code&gt; set.  Then&amp;nbsp;it&amp;nbsp;recurs.&lt;/p&gt;
&lt;p&gt;The code for this is surprisingly simple and easy to read.  It&amp;#8217;s mostly just
shuffling things between sets.  Eventually the &lt;code&gt;to-walk&lt;/code&gt; set will be empty and
&lt;code&gt;walked&lt;/code&gt; will contain all the coordinates that&amp;nbsp;we&amp;nbsp;want.&lt;/p&gt;
&lt;p&gt;Finally comes the function to create the region map for an&amp;nbsp;entire&amp;nbsp;level:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;get-region-map&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;loop &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter-walkable&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;all-coords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="nv"&gt;region-map&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
         &lt;span class="nv"&gt;n&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt; &lt;span class="nv"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;region-map&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;next-coord&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first &lt;/span&gt;&lt;span class="nv"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;next-region-coords&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;walkable-from&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt; &lt;span class="nv"&gt;next-coord&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;recur&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;difference &lt;/span&gt;&lt;span class="nv"&gt;remaining&lt;/span&gt; &lt;span class="nv"&gt;next-region-coords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;into &lt;/span&gt;&lt;span class="nv"&gt;region-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;vector&lt;/span&gt;
                                     &lt;span class="nv"&gt;next-region-coords&lt;/span&gt;
                                     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;repeat &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
               &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This function also uses Clojure sets to its advantage.  Once again, I loop
over a couple&amp;nbsp;of&amp;nbsp;variables.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;remaining&lt;/code&gt; is a set containing all the coordinates whose regions has not yet&amp;nbsp;been&amp;nbsp;determined.&lt;/p&gt;
&lt;p&gt;Each iteration it pulls off one of the remaining coordinates.  Note that I&amp;#8217;m
using &lt;code&gt;first&lt;/code&gt; to do this.  &lt;code&gt;remaining&lt;/code&gt; is a set, which is unordered, so &lt;code&gt;first&lt;/code&gt;
effectively could return any element in the set.  For this loop that doesn&amp;#8217;t
matter, but it&amp;#8217;s important to be aware of if you&amp;#8217;re going to use the&amp;nbsp;same&amp;nbsp;strategy.&lt;/p&gt;
&lt;p&gt;After pulling off a coordinate, it finds all coordinates walkable from that
coordinate with the &lt;code&gt;walkable-from&lt;/code&gt; flood-fill function.  It removes all of
those from the &lt;code&gt;remaining&lt;/code&gt; set, shoves them into the region map, and increments
the region number&amp;nbsp;before&amp;nbsp;recurring.&lt;/p&gt;
&lt;h2 id="visualization"&gt;Visualization&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m going to save the rest of Trystan&amp;#8217;s seventh post for another entry, but
since this one ended up pretty short I&amp;#8217;m also going to go over visualizing the
region map I&amp;#8217;ve&amp;nbsp;just&amp;nbsp;created.&lt;/p&gt;
&lt;p&gt;First I need to generate the region map when I create the world, and attach it
to the world itself so we can access it from&amp;nbsp;other&amp;nbsp;places:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;random-world&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;World&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;random-tiles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;nth &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;iterate &lt;/span&gt;&lt;span class="nv"&gt;smooth-world&lt;/span&gt; &lt;span class="nv"&gt;world&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;populate-world&lt;/span&gt; &lt;span class="nv"&gt;world&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="ss"&gt;:regions&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-region-map&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:tiles&lt;/span&gt; &lt;span class="nv"&gt;world&lt;/span&gt;&lt;span class="p"&gt;)))]&lt;/span&gt;
    &lt;span class="nv"&gt;world&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The last line in the &lt;code&gt;let&lt;/code&gt; is where it gets generated.  It&amp;#8217;s&amp;nbsp;pretty&amp;nbsp;straightforward.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to be able to toggle the visualization of regions off and on, so I&amp;#8217;m
going to introduce a new concept to the game:&amp;nbsp;&amp;#8220;debug&amp;nbsp;flags&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I updated the &lt;code&gt;Game&lt;/code&gt; record to include a slot for&amp;nbsp;these&amp;nbsp;flags:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defrecord &lt;/span&gt;&lt;span class="nv"&gt;Game&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="nv"&gt;uis&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt; &lt;span class="nv"&gt;debug-flags&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I then updated the &lt;code&gt;new-game&lt;/code&gt; function to initialize them (currently there&amp;#8217;s
only one) to&amp;nbsp;default&amp;nbsp;values:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;new-game&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map-&amp;gt;Game&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:world&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;
              &lt;span class="ss"&gt;:uis&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="ss"&gt;:start&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
              &lt;span class="ss"&gt;:input&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;
              &lt;span class="ss"&gt;:debug-flags&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:show-regions&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}}))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The user needs a way to toggle them.  For now I&amp;#8217;ll just bind it to a key.  In
the future I could make a debug &lt;span class="caps"&gt;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/span&gt; with a&amp;nbsp;nice&amp;nbsp;menu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defmethod &lt;/span&gt;&lt;span class="nv"&gt;process-input&lt;/span&gt; &lt;span class="ss"&gt;:play&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;input&lt;/span&gt;
    &lt;span class="ss"&gt;:enter&lt;/span&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="ss"&gt;:uis&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="ss"&gt;:win&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
    &lt;span class="ss"&gt;:backspace&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="ss"&gt;:uis&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&lt;span class="caps"&gt;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="ss"&gt;:lose&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
    &lt;span class="sc"&gt;\q&lt;/span&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assoc &lt;/span&gt;&lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="ss"&gt;:uis&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

    &lt;span class="sc"&gt;\h&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;update-in&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:world&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;move-player&lt;/span&gt; &lt;span class="ss"&gt;:w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="sc"&gt;\j&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;update-in&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:world&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;move-player&lt;/span&gt; &lt;span class="ss"&gt;:s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;; ...&lt;/span&gt;

    &lt;span class="sc"&gt;\R&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;update-in&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:debug-flags&lt;/span&gt; &lt;span class="ss"&gt;:show-regions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nv"&gt;game&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now when the user presses &lt;code&gt;R&lt;/code&gt; (Shift and R) it will toggle the state of the
&lt;code&gt;:show-regions&lt;/code&gt; debug flag in&amp;nbsp;the&amp;nbsp;game.&lt;/p&gt;
&lt;p&gt;All that&amp;#8217;s left is to actually &lt;em&gt;draw&lt;/em&gt; the regions somehow.  First, we only want
to do this if &lt;code&gt;:show-regions&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;.  I edited the &lt;code&gt;:play&lt;/code&gt; &lt;span class="caps"&gt;&lt;span class="caps"&gt;UI&lt;/span&gt;&lt;/span&gt;&amp;#8217;s drawing
function to&amp;nbsp;do&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defmethod &lt;/span&gt;&lt;span class="nv"&gt;draw-ui&lt;/span&gt; &lt;span class="ss"&gt;:play&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ui&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;world&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:world&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:keys&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;tiles&lt;/span&gt; &lt;span class="nv"&gt;entities&lt;/span&gt; &lt;span class="nv"&gt;regions&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="nv"&gt;world&lt;/span&gt;
        &lt;span class="nv"&gt;player&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:player&lt;/span&gt; &lt;span class="nv"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;cols&lt;/span&gt; &lt;span class="nv"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;s/get-size&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="nv"&gt;cols&lt;/span&gt;
        &lt;span class="nv"&gt;vrows&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dec &lt;/span&gt;&lt;span class="nv"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;origin&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-viewport-coords&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:location&lt;/span&gt; &lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;draw-world&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="nv"&gt;origin&lt;/span&gt; &lt;span class="nv"&gt;tiles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;; ******************&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-in&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:debug-flags&lt;/span&gt; &lt;span class="ss"&gt;:show-regions&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;draw-regions&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;regions&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="nv"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;; ******************&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;entity&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;vals &lt;/span&gt;&lt;span class="nv"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;draw-entity&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;origin&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="nv"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;draw-hud&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;game&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;draw-messages&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:messages&lt;/span&gt; &lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;highlight-player&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;origin&lt;/span&gt; &lt;span class="nv"&gt;player&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The marked lines are the only new ones.  I&amp;#8217;m going to draw regions after/above
the world tiles (so they&amp;#8217;ll show up at all) but before/below the entities (so we
can still see what&amp;#8217;s&amp;nbsp;going&amp;nbsp;on).&lt;/p&gt;
&lt;p&gt;Drawing the regions is fairly simple, if a&amp;nbsp;bit&amp;nbsp;tedious:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;draw-regions&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="nv"&gt;region-map&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ox&lt;/span&gt; &lt;span class="nv"&gt;oy&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;letfn&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;get-region-glyph&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;region-number&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;
              &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;
                &lt;span class="s"&gt;&amp;quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;/span&gt;
                &lt;span class="nv"&gt;region-number&lt;/span&gt;&lt;span class="p"&gt;)))]&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="nv"&gt;ox&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;ox&lt;/span&gt; &lt;span class="nv"&gt;vcols&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range &lt;/span&gt;&lt;span class="nv"&gt;oy&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+ &lt;/span&gt;&lt;span class="nv"&gt;oy&lt;/span&gt; &lt;span class="nv"&gt;vrows&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;region-number&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;region-map&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;when &lt;/span&gt;&lt;span class="nv"&gt;region-number&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;s/put-string&lt;/span&gt; &lt;span class="nv"&gt;screen&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="nv"&gt;ox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;- &lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="nv"&gt;oy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get-region-glyph&lt;/span&gt; &lt;span class="nv"&gt;region-number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:fg&lt;/span&gt; &lt;span class="ss"&gt;:blue&lt;/span&gt;&lt;span class="p"&gt;}))))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;For now, bad things will happen if we have more than 62 regions in a single
level.  In practice I usually end up with about 20 to 30, so it&amp;#8217;s not a&amp;nbsp;big&amp;nbsp;deal.&lt;/p&gt;
&lt;p&gt;To sum up this function: it iterates through every coordinate in the level
that&amp;#8217;s displayed in the viewport, looks up its region number in the region map,
and draws the appropriate letter if it has a&amp;nbsp;region&amp;nbsp;number.&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;Now that I&amp;#8217;ve got a way to visualize regions it becomes much easier to check
whether they&amp;#8217;re getting set correctly.  Here&amp;#8217;s an example of what it looks like
when you toggle &lt;code&gt;:show-regions&lt;/code&gt; with &lt;code&gt;R&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot without Regions" src="/media/images/blog/2012/10/caves-07-1-1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot with Regions" src="/media/images/blog/2012/10/caves-07-1-2.png" /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the small, closed off areas have their own numbers, while the
larger regions sprawl across&amp;nbsp;the&amp;nbsp;map.&lt;/p&gt;
&lt;p&gt;You can view the code &lt;a href="https://github.com/sjl/caves/tree/entry-07-1/src/caves"&gt;on GitHub&lt;/a&gt; if you want to see the&amp;nbsp;end&amp;nbsp;result.&lt;/p&gt;
&lt;p&gt;The next article will finish Trystan&amp;#8217;s seventh post by adding multiple z-levels
to&amp;nbsp;the&amp;nbsp;caves.&lt;/p&gt;
                
            
                    
                &lt;img src="http://feeds.feedburner.com/~r/stevelosh/~4/lVjWK3q5JiI" height="1" width="1"/&gt;</content><feedburner:origLink>http://stevelosh.com/blog/2012/10/caves-of-clojure-07-1/</feedburner:origLink></entry><entry><title type="html">Why I Two-Space</title><author><name>Steve Losh</name></author><link href="http://feedproxy.google.com/~r/stevelosh/~3/i8vr9fXyjAs/" /><updated>2012-10-12T10:10:00Z</updated><published>2012-10-12T10:10:00Z</published><id>http://stevelosh.com/blog/2012/10/why-i-two-space/</id><content type="html">
                    
                        
                
                    &lt;p&gt;If you look at &lt;a href="https://bitbucket.org/sjl/stevelosh/src/tip/content/blog"&gt;the source code&lt;/a&gt; for this blog, you might notice that
all my blog posts (written in &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;) have two spaces after&amp;nbsp;every&amp;nbsp;period.&lt;/p&gt;
&lt;p&gt;Every so often &lt;a href="http://www.slate.com/articles/technology/technology/2011/01/space_invaders.html"&gt;this Slate article&lt;/a&gt; makes the rounds and annoys me.  This
time I figured I&amp;#8217;d write a blog post/rant to get it off my chest once and for
all: two-spacing is equal or superior to one-spacing in all&amp;nbsp;non-trivial&amp;nbsp;ways.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-arguments-for-one-spacing"&gt;The Arguments&amp;nbsp;for&amp;nbsp;One-Spacing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#effort"&gt;Effort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#two-spacing-is-ugly"&gt;Two-Spacing is Ugly&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#source-and-presentation"&gt;Source&amp;nbsp;and&amp;nbsp;Presentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#typewriters"&gt;Typewriters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#power"&gt;Power&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#final-score"&gt;Final&amp;nbsp;Score&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="the-arguments-for-one-spacing"&gt;The Arguments&amp;nbsp;for&amp;nbsp;One-Spacing&lt;/h2&gt;
&lt;p&gt;If you read the aforementioned Slate article you&amp;#8217;ll see that it presents a total
of three arguments in favor of single-spacing after&amp;nbsp;a&amp;nbsp;period:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Many professional typographers find two-spacing ugly (though they have no
   actual evidence of its effects&amp;nbsp;on&amp;nbsp;readability).&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s less work to press the space bar once instead&amp;nbsp;of&amp;nbsp;twice.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s pretty much arbitrary anyway, so &lt;em&gt;why not&lt;/em&gt;?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You might also infer from the article&amp;#8217;s tone that &amp;#8220;you get to feel superior to
those Neanderthals that use two spaces&amp;#8221; is another argument in favor of it, but
I&amp;#8217;ll leave that one out because it can go&amp;nbsp;both&amp;nbsp;ways.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s go through these arguments one by one and see how they&amp;nbsp;hold&amp;nbsp;up.&lt;/p&gt;
&lt;h2 id="effort"&gt;Effort&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t think the &amp;#8220;it&amp;#8217;s more effort to press the space bar twice&amp;#8221; argument is at
all compelling.  The extra space &lt;em&gt;may&lt;/em&gt; account for around half a percent of the
keystrokes you type, depending on how long your sentences tend to run (mine
usually end up fairly long, as you&amp;nbsp;can&amp;nbsp;see).&lt;/p&gt;
&lt;p&gt;Not only is it not a large portion of your keystrokes, but the space bar has
your two strongest digits dedicated solely to it!  If any fingers are going to
wear out from typing, it won&amp;#8217;t be&amp;nbsp;your&amp;nbsp;thumbs.&lt;/p&gt;
&lt;p&gt;You could get pedantic and mention increased file size as a disadvantage of two
spacing, but let&amp;#8217;s not quibble about a few bytes when I can hold 32 gigabytes on
an &lt;span class="caps"&gt;&lt;span class="caps"&gt;SD&lt;/span&gt;&lt;/span&gt; card the size of a&amp;nbsp;postage&amp;nbsp;stamp.&lt;/p&gt;
&lt;h2 id="two-spacing-is-ugly"&gt;Two-Spacing&amp;nbsp;is&amp;nbsp;Ugly&lt;/h2&gt;
&lt;p&gt;The Slate article is correct is saying that many professional typographers think
two-spacing is ugly.  My copy of &lt;a href="http://www.amazon.com/dp/0881792063/?tag=stelos-20"&gt;The Elements of Typographic Style&lt;/a&gt;
agrees.  However, there&amp;#8217;s more to the issue than a single&amp;nbsp;blanket&amp;nbsp;rule.&lt;/p&gt;
&lt;h3 id="source-and-presentation"&gt;Source&amp;nbsp;and&amp;nbsp;Presentation&lt;/h3&gt;
&lt;p&gt;If you&amp;#8217;re reading this in a web browser and look closely, you&amp;#8217;ll notice that
there&amp;#8217;s only one space between each sentence.  I said I used two, so&amp;nbsp;what&amp;nbsp;happened?&lt;/p&gt;
&lt;p&gt;Web browsers, by default, collapse successive whitespace into a single space when it
renders the &lt;span class="caps"&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/span&gt;.  You could put a thousand spaces between sentences in the
source and it would still come&amp;nbsp;out&amp;nbsp;single-spaced.&lt;/p&gt;
&lt;p&gt;Another widely-used format, LaTeX, splits the difference and actually uses
somewhere between one and two spaces&amp;nbsp;(by&amp;nbsp;default).&lt;/p&gt;
&lt;p&gt;The key idea here is that what you type and what the end user actually reads are
two different things.  They don&amp;#8217;t need to be bound together.  It&amp;#8217;s possible to
type two spaces but get one in your output (or in LaTeX&amp;#8217;s case: an even more
pleasing &amp;#8220;one and&amp;nbsp;a&amp;nbsp;bit&amp;#8221;).&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re using a &lt;span class="caps"&gt;&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;&lt;/span&gt; editor like Microsoft Word this may not be the case.
For the high school students typing up papers for class: sure, go ahead and
single-space.  But if you&amp;#8217;re still using Word to type up things like books, long
blog posts, or technical documentation, you&amp;#8217;re doing yourself a disservice.
Learn to use a system like LaTeX so your source and rendered output aren&amp;#8217;t&amp;nbsp;locked&amp;nbsp;together.&lt;/p&gt;
&lt;p&gt;This means that &amp;#8220;two-spacing looks ugly&amp;#8221; doesn&amp;#8217;t imply &amp;#8220;you should not type two
spaces when you write&amp;#8221;.  It &lt;em&gt;actually&lt;/em&gt; implies &amp;#8220;you should use a system that
results in single-spacing when rendered&amp;#8221;, and most of the common ones today will
do&amp;nbsp;exactly&amp;nbsp;that.&lt;/p&gt;
&lt;h3 id="typewriters"&gt;Typewriters&lt;/h3&gt;
&lt;p&gt;So we&amp;#8217;ve seen that the &amp;#8220;extra spaces take more effort&amp;#8221; argument isn&amp;#8217;t
convincing, and that &amp;#8220;two-spacing in the final output is ugly&amp;#8221; doesn&amp;#8217;t prevent
you from using two spaces in&amp;nbsp;the&amp;nbsp;input.&lt;/p&gt;
&lt;p&gt;But so far I haven&amp;#8217;t given you any reason &lt;em&gt;for&lt;/em&gt; using two spaces.  That&amp;#8217;s the
Slate article&amp;#8217;s third argument: &amp;#8220;it&amp;#8217;s arbitrary anyway, so you may as well&amp;nbsp;use&amp;nbsp;one&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s fix that by examining the common holier-than-thou put-down of &amp;#8220;two-spacing
was useful back when people used &lt;em&gt;typewriters&lt;/em&gt;,&amp;nbsp;you&amp;nbsp;dinosaur!&amp;#8221;.&lt;/p&gt;
&lt;p&gt;To his credit, the Slate author correctly points out that it&amp;#8217;s not the fact that
people used typewriters that made two-spacing popular, it was the fact that
&lt;em&gt;typewriters used monospaced fonts&lt;/em&gt;.  Most people miss that&amp;nbsp;logical&amp;nbsp;leap.&lt;/p&gt;
&lt;p&gt;Unfortunately he follows that&amp;nbsp;up&amp;nbsp;with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here&amp;#8217;s the thing, though: Monospaced fonts went out in&amp;nbsp;the&amp;nbsp;1970s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For the average person typing up a school paper here and there, sure.  But for
many people doing a large amount of writing for LaTeX books and papers,
technical documentation, code comments, mailing lists, blog posts, and lots of
other things, it&amp;#8217;s simply &lt;em&gt;wrong&lt;/em&gt; for one&amp;nbsp;big&amp;nbsp;reason:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Text editors use&amp;nbsp;monospaced&amp;nbsp;fonts!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It doesn&amp;#8217;t matter what editor you use.  Vim, Emacs, TextMate, Sublime Text,
Eclipse, Gedit, Notepad++?  &lt;em&gt;All&lt;/em&gt; of them use&amp;nbsp;monospaced&amp;nbsp;fonts.&lt;/p&gt;
&lt;p&gt;Going back to the typewriter quip, this means that if people used two spaces
when writing on typewriters because it looked better, then using two spaces in
a text editor will look better.  And we know that because there&amp;#8217;s a distinction
between source and presentation in non-&lt;span class="caps"&gt;&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;&lt;/span&gt; contexts, we can use separate
strategies&amp;nbsp;for&amp;nbsp;each.&lt;/p&gt;
&lt;p&gt;We can have our cake and eat it too!  We can type two spaces after a period to
make our text look better as we write, revise, and edit it, and then render it
to single-spacing (or &amp;#8220;space-and-a-half-ing&amp;#8221;) to give our readers a beautiful
reading experience with&amp;nbsp;pleasant&amp;nbsp;spacing.&lt;/p&gt;
&lt;p&gt;So now two-spacing has a real advantage over single-spacing.  That&amp;#8217;s enough to
make it preferable.  But let&amp;#8217;s look at one more advantage for power users, just
to seal&amp;nbsp;the&amp;nbsp;deal.&lt;/p&gt;
&lt;h2 id="power"&gt;Power&lt;/h2&gt;
&lt;p&gt;If you use &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; to edit text, you&amp;#8217;re probably familiar with its &amp;#8220;text
objects&amp;#8221;.  Text objects are what let you move and act on whole chunks of text at
a time.  For example, instead of deleting a word letter-by-letter you can use
&lt;code&gt;daw&lt;/code&gt; to &amp;#8220;delete&amp;nbsp;around&amp;nbsp;word&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Vim comes with a &amp;#8220;sentence&amp;#8221; text object built-in.  You can move around your
document sentence-by-sentence with &lt;code&gt;(&lt;/code&gt; and &lt;code&gt;)&lt;/code&gt;, and yank/delete/change/etc
entire sentences with &lt;code&gt;cas&lt;/code&gt; (&amp;#8220;change around sentence&amp;#8221;) and&amp;nbsp;so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;You can probably guess where this is going.  If you single-space sentences Vim
will do its best to &amp;#8220;do the right thing&amp;#8221;, but inevitably gets tripped up when
you&amp;#8217;ve got punctuation in your sentence.&amp;nbsp;For&amp;nbsp;example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Bob&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="n"&gt;speaking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Smith&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
                                    &lt;span class="o"&gt;^&lt;/span&gt;
                                    &lt;span class="n"&gt;cursor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;What happens when you tell Vim to &amp;#8220;delete around&amp;nbsp;sentence&amp;#8221;&amp;nbsp;now?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Bob&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="n"&gt;speaking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
                                  &lt;span class="o"&gt;^&lt;/span&gt;
                                  &lt;span class="n"&gt;cursor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Well that&amp;#8217;s not right!  Vim can&amp;#8217;t easily tell the difference between the period
after &amp;#8220;Mr&amp;#8221; and the end of a sentence.  What happens if you type your prose with&amp;nbsp;two-spacing&amp;nbsp;instead?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Bob&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="n"&gt;speaking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Smith&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;  &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
                                     &lt;span class="o"&gt;^&lt;/span&gt;
                                     &lt;span class="n"&gt;cursor&lt;/span&gt;
&lt;span class="n"&gt;Bob&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="n"&gt;speaking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
                       &lt;span class="o"&gt;^&lt;/span&gt;
                       &lt;span class="n"&gt;cursor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This time Vim is able to delete the sentence correctly!  Note that you&amp;#8217;ll need
to make sure to &lt;code&gt;set cpo+=J&lt;/code&gt; in your &lt;code&gt;~/.vimrc&lt;/code&gt; file to tell Vim &amp;#8220;don&amp;#8217;t worry,
I&amp;#8217;m using two spaces like a sane person&amp;#8221; for this&amp;nbsp;to&amp;nbsp;work.&lt;/p&gt;
&lt;p&gt;Two-spacing provides more semantic information, which means that software can
parse and work with it more easily.  I&amp;#8217;m sure Emacs has something similar, and
if you or someone else ever needs to parse your writing programatically they&amp;#8217;ll
have an&amp;nbsp;easier&amp;nbsp;time.&lt;/p&gt;
&lt;h2 id="final-score"&gt;Final&amp;nbsp;Score&lt;/h2&gt;
&lt;p&gt;To recap, the arguments &lt;em&gt;for&lt;/em&gt;&amp;nbsp;single-spacing&amp;nbsp;are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Two-spacing is ugly in&amp;nbsp;proportional&amp;nbsp;fonts.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s less work to press the space bar once instead&amp;nbsp;of&amp;nbsp;twice.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s pretty much arbitrary anyway, so why bother&amp;nbsp;with&amp;nbsp;two?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Number 1 is irrelevant, because writing and rendering are (except in trivial
cases) two&amp;nbsp;orthogonal&amp;nbsp;activities.&lt;/p&gt;
&lt;p&gt;Number 2 isn&amp;#8217;t&amp;nbsp;very&amp;nbsp;convincing.&lt;/p&gt;
&lt;p&gt;Number 3 is false, because two-spacing gives you two advantages&amp;nbsp;over&amp;nbsp;one-spacing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It looks better in&amp;nbsp;your&amp;nbsp;editor.&lt;/li&gt;
&lt;li&gt;It gives you more power when editing&amp;nbsp;and&amp;nbsp;parsing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So the next time you see that arrogant Slate article, feel free to be arrogant
right back.  Wield your extra spaces proudly, because they give you both comfort&amp;nbsp;and&amp;nbsp;power!&lt;/p&gt;
                
            
                    
                &lt;img src="http://feeds.feedburner.com/~r/stevelosh/~4/i8vr9fXyjAs" height="1" width="1"/&gt;</content><feedburner:origLink>http://stevelosh.com/blog/2012/10/why-i-two-space/</feedburner:origLink></entry></feed>
