<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Artisan Coder &#187; Scheme</title>
	<atom:link href="http://www.artisancoder.com/category/programming/scheme-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artisancoder.com</link>
	<description>Software development as a craft</description>
	<lastBuildDate>Thu, 15 Dec 2011 10:57:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SICP 2.5</title>
		<link>http://www.artisancoder.com/2011/12/sicp-2-5/</link>
		<comments>http://www.artisancoder.com/2011/12/sicp-2-5/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 10:57:08 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>

		<guid isPermaLink="false">http://www.artisancoder.com/?p=208</guid>
		<description><![CDATA[James Long is solving some SICP exercises and posting the solutions in his blog. Every software developer, me included, should do that! He posted yesterday the solution for exercise 2.5, which reads: Show that we can represent pairs of nonnegative integers using only numbers and arithmetic operations if we represent the pair a and b [...]]]></description>
			<content:encoded><![CDATA[<p>James Long is solving some <a href="http://mitpress.mit.edu/sicp/" title="Structure and Interpretation of Computer Programs">SICP</a> exercises and posting the solutions in his <a href="http://jlongster.com/" title="Keeping an eye out for interesting things">blog</a>. Every software developer, me included, should do that! He <a href="http://jlongster.com/2011/12/14/sicp-25.html" title="SICP 2.5">posted yesterday</a> the solution for <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#%_thm_2.5" title="Structure and Interpretation of Computer Programs">exercise 2.5</a>, which reads:</p>
<blockquote>
<p>Show that we can represent pairs of nonnegative integers using only numbers and arithmetic operations if we represent the pair a and b as the integer that is the product 2^a * 3^b. Give the corresponding definitions of the procedures cons, car, and cdr.</p>
</blockquote>
<p>He confesses that couldn&#8217;t figure the math, and points to a solution in the <a href="http://community.schemewiki.org/?sicp-ex-2.5" title="sicp-ex-2.5">schemewiki</a>. In the end, it is assumed that the code works because one base used is even (2) and the other is odd (3), so the resulting integer can only be divided by 2 a number of times equal to <code>a</code>. In fact, the solution to this problem has nothing to do with parity, but with the <a href="http://en.wikipedia.org/wiki/Fundamental_theorem_of_arithmetic" title="Fundamental theorem of arithmetic">fundamental theorem of arithmetic</a>:</p>
<blockquote>
<p>the fundamental theorem of arithmetic (or the unique-prime-factorization theorem) states that any integer greater than 1 can be written as a unique product (up to ordering of the factors) of prime numbers. For example,</p>
<pre>6936 = 2^3 * 3^1 * 17^2
1200 = 2^4 * 3^1 * 5^2
</pre>
<p>are two numbers satisfying the hypothesis of the theorem that can be written as the product of prime numbers.</p>
</blockquote>
<p>What this means is that if we use prime numbers as bases for the construction of pairs as numbers, we have a guarantee that we will be able to retrieve the original numbers back, because the numbers we have encoded in the &#8220;pair&#8221; are the only representation possible. So what really matters is that 2 and 3 are prime numbers. In fact, using 5 and 7 as bases would work perfectly as well:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="sy0">*</span>const<span class="sy0">-</span>m<span class="sy0">*</span> <span class="nu0">5</span><span class="br0">&#41;</span>
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="sy0">*</span>const<span class="sy0">-</span>n<span class="sy0">*</span> <span class="nu0">7</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1">;; &quot;integer logarithm&quot;, a friendly misnomer</span>
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>ilog a b<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> loop <span class="br0">&#40;</span><span class="br0">&#40;</span>i <span class="nu0">0</span><span class="br0">&#41;</span>
             <span class="br0">&#40;</span>a a<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">zero?</span> <span class="br0">&#40;</span><span class="kw1">remainder</span> a b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>loop <span class="br0">&#40;</span><span class="sy0">+</span> i <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">quotient</span> a b<span class="br0">&#41;</span><span class="br0">&#41;</span>
    i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>kons a b<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="sy0">*</span> <span class="br0">&#40;</span><span class="kw1">expt</span> <span class="sy0">*</span>const<span class="sy0">-</span>m<span class="sy0">*</span> a<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">expt</span> <span class="sy0">*</span>const<span class="sy0">-</span>n<span class="sy0">*</span> b<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>kar a<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>ilog a <span class="sy0">*</span>const<span class="sy0">-</span>m<span class="sy0">*</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>kdr a<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>ilog a <span class="sy0">*</span>const<span class="sy0">-</span>n<span class="sy0">*</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Let&#8217;s see a quick session. By the way, Scheme&#8217;s support for integers of arbitrary size really helps here:</p>
<pre>> (define a (kons 23 56))
> a
2522320911913220782729737303110106900811912937176227569580078125
> (kar a)
23
> (kdr a)
56
> (define b (kons 127 99))
> (kar b)
127
> (kdr b)
99
</pre>
<p>As a side note, instead of something like my <code>ilog</code>, the solution in schemewiki uses this function:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>count<span class="sy0">-</span><span class="nu0">0</span><span class="sy0">-</span>remainder<span class="sy0">-</span>divisions n divisor<span class="br0">&#41;</span> 
  <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter try<span class="sy0">-</span><span class="kw1">exp</span><span class="br0">&#41;</span> 
   <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="nu0">0</span> <span class="br0">&#40;</span><span class="kw1">remainder</span> n <span class="br0">&#40;</span><span class="kw1">exp</span> divisor try<span class="sy0">-</span><span class="kw1">exp</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
       <span class="br0">&#40;</span>iter <span class="br0">&#40;</span><span class="sy0">+</span> try<span class="sy0">-</span><span class="kw1">exp</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>  <span class="co1">;; Try another division. </span>
       <span class="br0">&#40;</span><span class="sy0">-</span> try<span class="sy0">-</span><span class="kw1">exp</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
  <span class="co1">;; We don't need to try 0 divisions, as that will obviously pass. </span>
  <span class="br0">&#40;</span>iter <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>It uses exponentiation in every step of the loop, which strikes me as very inefficient.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2011/12/sicp-2-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CPS and beta-reduction</title>
		<link>http://www.artisancoder.com/2011/04/cps-and-beta-reduction/</link>
		<comments>http://www.artisancoder.com/2011/04/cps-and-beta-reduction/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 19:46:16 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[cps]]></category>
		<category><![CDATA[lambda calculus]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.artisancoder.com/?p=197</guid>
		<description><![CDATA[I have finally implemented in Sly a pass to convert the code to Continuation-passing style (CPS), after reading an interesting article by Matt Might. I was not satisfied with the conversion algorithms I saw previously, but the &#8220;hybrid CPS conversion&#8221; is what I was really looking for. No extra &#946;- or &#951;-redexes are inserted during [...]]]></description>
			<content:encoded><![CDATA[<p>I have finally implemented in Sly a pass to convert the code to <a href="http://en.wikipedia.org/wiki/Continuation-passing_style" title="Continuation-passing style">Continuation-passing style</a> (CPS), after reading an <a href="http://matt.might.net/articles/cps-conversion/" title="How to compile with continuations">interesting article</a> by Matt Might. I was not satisfied with the conversion algorithms I saw previously, but the &#8220;hybrid CPS conversion&#8221; is what I was really looking for. No extra &#946;- or &#951;-redexes are inserted during conversion (actually, an &#951;-redex is introduced when converting conditionals to avoid exponencial code size explosion). I will not say much more about the conversion algorithm because Matt&#8217;s articles are excellent.</p>
<p>Using CPS as intermediate language has many advantages in general and specially for Scheme. In general, it is a simpler, more uniform language in which all transfers of control are explicit and all intermediate values are named. For Scheme, it makes all continuations explicit, which can then be captured by <code>call-with-current-continuation</code>. Nevertheless, most optimising compilers that use CPS as intermediate language marks introduced continuation closures as special and allocate them on the usual call/return control stack, even for Scheme, because the stack interacts better with memory caches in current processors. Capturing the current continuation is implemented with more complicated techniques like copying the control stack to the heap.</p>
<p>But how exactly does CPS make it easier to apply optimisations to the code? I am going to illustrate one of the possible optimisations with an example based on the code to solve the <a href="http://en.wikipedia.org/wiki/Eight_queens_puzzle" title="Eight Queens Puzzle">N-Queens problem</a>:</p>
<div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>nqueens n<span class="br0">&#41;</span>
&nbsp;
  <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>dec<span class="sy0">-</span>to n<span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">let</span> loop <span class="br0">&#40;</span><span class="br0">&#40;</span>i n<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">l</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">=</span> i <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">l</span> <span class="br0">&#40;</span>loop <span class="br0">&#40;</span><span class="sy0">-</span> i <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> i <span class="kw1">l</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
  <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>try x y z<span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> x<span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> y<span class="br0">&#41;</span>
        <span class="nu0">1</span>
        <span class="nu0">0</span><span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="sy0">+</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>ok? <span class="br0">&#40;</span><span class="kw1">car</span> x<span class="br0">&#41;</span> <span class="nu0">1</span> z<span class="br0">&#41;</span>
           <span class="br0">&#40;</span>try <span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span><span class="kw1">cdr</span> x<span class="br0">&#41;</span> y<span class="br0">&#41;</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> <span class="br0">&#40;</span><span class="kw1">car</span> x<span class="br0">&#41;</span> z<span class="br0">&#41;</span><span class="br0">&#41;</span>
           <span class="nu0">0</span><span class="br0">&#41;</span>
         <span class="br0">&#40;</span>try <span class="br0">&#40;</span><span class="kw1">cdr</span> x<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> <span class="br0">&#40;</span><span class="kw1">car</span> x<span class="br0">&#41;</span> y<span class="br0">&#41;</span> z<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
  <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>ok? row dist placed<span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> placed<span class="br0">&#41;</span>
      #t
      <span class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">car</span> placed<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">+</span> row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
           <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">car</span> placed<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">-</span> row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
           <span class="br0">&#40;</span>ok? row <span class="br0">&#40;</span><span class="sy0">+</span> dist <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cdr</span> placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
  <span class="br0">&#40;</span>try <span class="br0">&#40;</span>dec<span class="sy0">-</span>to n<span class="br0">&#41;</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div>
<p>For now I will focus on the <code>ok?</code> procedure. After macro expansion we have:</p>
<div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ok? <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>row dist placed<span class="br0">&#41;</span>
                   <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> placed<span class="br0">&#41;</span>
                       #t
                       <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>temp1<span class="br0">&#41;</span>
                          <span class="br0">&#40;</span><span class="kw1">if</span> temp1
                              <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>temp2<span class="br0">&#41;</span>
                                 <span class="br0">&#40;</span><span class="kw1">if</span> temp2
                                     <span class="br0">&#40;</span>ok? row <span class="br0">&#40;</span><span class="sy0">+</span> dist <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cdr</span> placed<span class="br0">&#41;</span><span class="br0">&#41;</span>
                                     temp2<span class="br0">&#41;</span><span class="br0">&#41;</span>
                               <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">car</span> placed<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">-</span> row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                              temp1<span class="br0">&#41;</span><span class="br0">&#41;</span>
                        <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span><span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw1">car</span> placed<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="sy0">+</span> row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div>
<p>The expansion of the <code>and</code> macro has created some procedures that are applied to their arguments right away, and not needed otherwise. Now let us convert this code to CPS:</p>
<div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ok? <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k1 row dist placed<span class="br0">&#41;</span>
                <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k2 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r1<span class="br0">&#41;</span>
                                 <span class="br0">&#40;</span><span class="kw1">if</span> r1
                                     <span class="br0">&#40;</span>k1 #t<span class="br0">&#41;</span>
                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>l1 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k3 temp1<span class="br0">&#41;</span>
                                                      <span class="br0">&#40;</span><span class="kw1">if</span> temp1
                                                          <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>l2 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k4 temp2<span class="br0">&#41;</span>
                                                                           <span class="br0">&#40;</span><span class="kw1">if</span> temp2
                                                                               <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k5 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r2<span class="br0">&#41;</span>
                                                                                                <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k6 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r3<span class="br0">&#41;</span>
                                                                                                                 <span class="br0">&#40;</span>ok? k4 row r2 r3<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                  <span class="br0">&#40;</span><span class="kw1">cdr</span> k6 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                 <span class="br0">&#40;</span><span class="sy0">+</span> k5 dist <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                               <span class="br0">&#40;</span>k4 temp2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                            <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k7 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r4<span class="br0">&#41;</span>
                                                                             <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k8 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r5<span class="br0">&#41;</span>
                                                                                              <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k9 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r6<span class="br0">&#41;</span>
                                                                                                               <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k10
                                                                                                                         <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r7<span class="br0">&#41;</span>
                                                                                                                           <span class="br0">&#40;</span>l2 k3 r7<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                 <span class="br0">&#40;</span><span class="kw1">not</span> k10 r6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                <span class="br0">&#40;</span><span class="sy0">=</span> k9 r4 r5<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                               <span class="br0">&#40;</span><span class="sy0">-</span> k8 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                              <span class="br0">&#40;</span><span class="kw1">car</span> k7 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                          <span class="br0">&#40;</span>k3 temp1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                       <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k11 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r8<span class="br0">&#41;</span>
                                                        <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k12 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r9<span class="br0">&#41;</span>
                                                                         <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k13 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r10<span class="br0">&#41;</span>
                                                                                          <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k14 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r11<span class="br0">&#41;</span>
                                                                                                           <span class="br0">&#40;</span>l1 k1 r11<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                            <span class="br0">&#40;</span><span class="kw1">not</span> k14 r10<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                           <span class="br0">&#40;</span><span class="sy0">=</span> k13 r8 r9<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                          <span class="br0">&#40;</span><span class="sy0">+</span> k12 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                         <span class="br0">&#40;</span><span class="kw1">car</span> k11 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                  <span class="br0">&#40;</span><span class="kw1">null?</span> k2 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div>
<p>The code has increased in size but is simpler and easier to analyse and manipulate. For instance, in the code above we see that <code>l2</code> is a procedure that is called only once, and is not passed as an argument to any other procedure. We can then replace the only call site of <code>l2</code> with the body of the procedure, provided that we substitute the formal parameters for the actual arguments.  This inlining is called <em>&#946;-reduction</em>. Since no argument in the CPS can have side effects, &#946;-reduction is sound:</p>
<div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ok? <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k1 row dist placed<span class="br0">&#41;</span>
                <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k2 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r1<span class="br0">&#41;</span>
                                 <span class="br0">&#40;</span><span class="kw1">if</span> r1
                                     <span class="br0">&#40;</span>k1 #t<span class="br0">&#41;</span>
                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>l1 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k3 temp1<span class="br0">&#41;</span>
                                                    <span class="br0">&#40;</span><span class="kw1">if</span> temp1
                                                        <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k7 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r4<span class="br0">&#41;</span>
                                                                       <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k8 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r5<span class="br0">&#41;</span>
                                                                                      <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k9 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r6<span class="br0">&#41;</span>
                                                                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k10
                                                                                                               <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r7<span class="br0">&#41;</span>
                                                                                                                 <span class="br0">&#40;</span><span class="kw1">if</span> r7
                                                                                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k5 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r2<span class="br0">&#41;</span>
                                                                                                                                    <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k6 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r3<span class="br0">&#41;</span>
                                                                                                                                                   <span class="br0">&#40;</span>ok? k3 row r2 r3<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                      <span class="br0">&#40;</span><span class="kw1">cdr</span> k6 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                       <span class="br0">&#40;</span><span class="sy0">+</span> k5 dist <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                     <span class="br0">&#40;</span>k3 r7<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                       <span class="br0">&#40;</span><span class="kw1">not</span> k10 r6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                        <span class="br0">&#40;</span><span class="sy0">=</span> k9 r4 r5<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                         <span class="br0">&#40;</span><span class="sy0">-</span> k8 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                          <span class="br0">&#40;</span><span class="kw1">car</span> k7 placed<span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                          <span class="br0">&#40;</span>k3 temp1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                       <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k11 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r8<span class="br0">&#41;</span>
                                                        <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k12 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r9<span class="br0">&#41;</span>
                                                                         <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k13 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r10<span class="br0">&#41;</span>
                                                                                          <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k14 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r11<span class="br0">&#41;</span>
                                                                                                           <span class="br0">&#40;</span>l1 k1 r11<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                            <span class="br0">&#40;</span><span class="kw1">not</span> k14 r10<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                           <span class="br0">&#40;</span><span class="sy0">=</span> k13 r8 r9<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                          <span class="br0">&#40;</span><span class="sy0">+</span> k12 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                         <span class="br0">&#40;</span><span class="kw1">car</span> k11 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                  <span class="br0">&#40;</span><span class="kw1">null?</span> k2 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div>
<p>After this we got rid of <code>l2</code>, which means less one closure to allocate and call. We can do the same with <code>l1</code>:</p>
<div class="scheme"><pre class="de1"><span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ok? <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>k1 row dist placed<span class="br0">&#41;</span>
                <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k2 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r1<span class="br0">&#41;</span>
                                 <span class="br0">&#40;</span><span class="kw1">if</span> r1
                                     <span class="br0">&#40;</span>k1 #t<span class="br0">&#41;</span>
                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k11 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r8<span class="br0">&#41;</span>
                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k12 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r9<span class="br0">&#41;</span>
                                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k13 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r10<span class="br0">&#41;</span>
                                                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k14 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r11<span class="br0">&#41;</span>
                                                                                                     <span class="br0">&#40;</span><span class="kw1">if</span> r11
                                                                                                         <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k7 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r4<span class="br0">&#41;</span>
                                                                                                                        <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k8 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r5<span class="br0">&#41;</span>
                                                                                                                                       <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k9 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r6<span class="br0">&#41;</span>
                                                                                                                                                      <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k10
                                                                                                                                                                <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r7<span class="br0">&#41;</span>
                                                                                                                                                                  <span class="br0">&#40;</span><span class="kw1">if</span> r7
                                                                                                                                                                      <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k5 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r2<span class="br0">&#41;</span>
                                                                                                                                                                                     <span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>k6 <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>r3<span class="br0">&#41;</span>
                                                                                                                                                                                                    <span class="br0">&#40;</span>ok? k1 row r2 r3<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                                                                       <span class="br0">&#40;</span><span class="kw1">cdr</span> k6 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                                                        <span class="br0">&#40;</span><span class="sy0">+</span> k5 dist <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                                                      <span class="br0">&#40;</span>k1 r7<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                                        <span class="br0">&#40;</span><span class="kw1">not</span> k10 r6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                                         <span class="br0">&#40;</span><span class="sy0">=</span> k9 r4 r5<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                                          <span class="br0">&#40;</span><span class="sy0">-</span> k8 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                           <span class="br0">&#40;</span><span class="kw1">car</span> k7 placed<span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                                         <span class="br0">&#40;</span>k1 r11<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                                       <span class="br0">&#40;</span><span class="kw1">not</span> k14 r10<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                                       <span class="br0">&#40;</span><span class="sy0">=</span> k13 r8 r9<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                                       <span class="br0">&#40;</span><span class="sy0">+</span> k12 row dist<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                                       <span class="br0">&#40;</span><span class="kw1">car</span> k11 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                  <span class="br0">&#40;</span><span class="kw1">null?</span> k2 placed<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div>
<p>So we see that two closures previously introduced during macro expansion are now gone. Notice that the continuation passed to the recursive call to <code>ok?</code> is <code>k1</code>, confirming that tail calls do not create new continuations. In the original code we see a procedure called <code>dec-to</code> which is also called only once as an argument to <code>try</code>. That procedure is also &#946;-reduced in the same compiler pass. Other optimisations are also made simple by CPS, and I have implemented some of them in the same pass: Dead-variable elimination, removal of unreachable branches and dropping unused arguments to known procedures.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2011/04/cps-and-beta-reduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple releases its grip</title>
		<link>http://www.artisancoder.com/2010/09/apple-releases-its-grip/</link>
		<comments>http://www.artisancoder.com/2010/09/apple-releases-its-grip/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 14:17:12 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[agreement]]></category>
		<category><![CDATA[app store]]></category>
		<category><![CDATA[apple]]></category>

		<guid isPermaLink="false">http://www.artisancoder.com/?p=190</guid>
		<description><![CDATA[From now on no more guessing is necessary. Apple has released a new developer agreement with much more relaxed rules. From the press release: &#8220;In particular, we are relaxing all restrictions on the development tools used to create iOS apps, as long as the resulting apps do not download any code. This should give developers [...]]]></description>
			<content:encoded><![CDATA[<p>From now on no more guessing is necessary. Apple has released a new developer agreement with much more relaxed rules. From the <a href="http://www.apple.com/pr/library/2010/09/09statement.html" title="Statement by Apple on App Store Review Guidelines">press release</a>:</p>
<blockquote>
<p>&#8220;In particular, we are relaxing <strong>all</strong> restrictions on the development tools used to create iOS apps, as long as the resulting apps do not download any code. This should give developers the flexibility they want, while preserving the security we need.&#8221;</p>
</blockquote>
<p>So any tool or language, Scheme included, is fair game now. Let&#8217;s code!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2010/09/apple-releases-its-grip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Praising macros</title>
		<link>http://www.artisancoder.com/2010/06/praising-macros/</link>
		<comments>http://www.artisancoder.com/2010/06/praising-macros/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 21:37:20 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[syntax]]></category>

		<guid isPermaLink="false">http://www.artisancoder.com/?p=182</guid>
		<description><![CDATA[Macros are an indispensable programming feature. While procedures (functions, methods, messages etc.) let developers reuse common computation patterns, macros allow the abstraction of common syntactic constructions. These constructions can be as simple as a new control operator, or can be full domain-specific languages. For instance, there is no when operator in Scheme, but a lot [...]]]></description>
			<content:encoded><![CDATA[<p>Macros are an indispensable programming feature. While procedures (functions, methods, messages etc.) let developers reuse common computation patterns, macros allow the abstraction of common syntactic constructions. These constructions can be as simple as a new control operator, or can be full <a href="http://en.wikipedia.org/wiki/Domain-specific_language" title="Domain-specific language">domain-specific languages</a>. For instance, there is no <tt>when</tt> operator in Scheme, but a lot of people like it. It simply tests a condition and execute a block of code if the former evaluates to true:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1"><span class="br0">&#40;</span>when <span class="br0">&#40;</span>launch<span class="sy0">-</span>authorised? president<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>fuel<span class="sy0">-</span>missile icbm<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>open<span class="sy0">-</span>hatch silo<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>launch<span class="sy0">-</span>missile icbm<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Another example of control operator is the very useful <a href="http://www.artisancoder.com/2008/12/equivalent-of-and-let/" title="Equivalent of and-let*?"><tt>and-let*</tt></a> macro, semi-standardised in <a href="http://srfi.schemers.org/srfi-2/" title="SRFI 2: AND-LET*: an AND with local bindings, a guarded LET* special form">SRFI-2</a>, tests several expressions in sequence, aborting the computation if any of them evaluates to false, optionally binding variables to the expressions&#8217;s resulting values in nested scopes otherwise. If none of the expressions evaluate to false, the body is executed in the resulting lexical environment. Those familiar with Haskell may find it somewhat similar to the <tt>Maybe</tt> monad.</p>
<p>Actually several of Scheme&#8217;s own standard control operators are macros, implemented almost exactly as user-defined macros. A named <tt>let</tt> can be easily rewritten as a <tt>letrec</tt> operator:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1"><span class="co1">;; a named let expression</span>
<span class="br0">&#40;</span><span class="kw1">let</span> collect <span class="br0">&#40;</span><span class="br0">&#40;</span>seq <span class="br0">&#40;</span>produce<span class="sy0">-</span>list<span class="sy0">-</span>of<span class="sy0">-</span>numbers<span class="br0">&#41;</span><span class="br0">&#41;</span>
              <span class="br0">&#40;</span>even '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
              <span class="br0">&#40;</span>odd '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> seq<span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="kw1">cons</span> even odd<span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>num <span class="br0">&#40;</span><span class="kw1">car</span> seq<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">even?</span> num<span class="br0">&#41;</span>
            <span class="br0">&#40;</span>collect <span class="br0">&#40;</span><span class="kw1">cdr</span> seq<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> num even<span class="br0">&#41;</span> odd<span class="br0">&#41;</span>
            <span class="br0">&#40;</span>collect <span class="br0">&#40;</span><span class="kw1">cdr</span> seq<span class="br0">&#41;</span> even <span class="br0">&#40;</span><span class="kw1">cons</span> num odd<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1">;; becomes a letrec expression</span>
<span class="br0">&#40;</span><span class="kw1">letrec</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>collect <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>seq even odd<span class="br0">&#41;</span>
                    <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> seq<span class="br0">&#41;</span>
                        <span class="br0">&#40;</span><span class="kw1">cons</span> even odd<span class="br0">&#41;</span>
                        <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>num <span class="br0">&#40;</span><span class="kw1">car</span> seq<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                         <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">even?</span> num<span class="br0">&#41;</span>
                             <span class="br0">&#40;</span>collect <span class="br0">&#40;</span><span class="kw1">cdr</span> seq<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> num even<span class="br0">&#41;</span> odd<span class="br0">&#41;</span>
                             <span class="br0">&#40;</span>collect <span class="br0">&#40;</span><span class="kw1">cdr</span> seq<span class="br0">&#41;</span> even <span class="br0">&#40;</span><span class="kw1">cons</span> num odd<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
  <span class="br0">&#40;</span>collect <span class="br0">&#40;</span>produce<span class="sy0">-</span>list<span class="sy0">-</span>of<span class="sy0">-</span>numbers<span class="br0">&#41;</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span> '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Macros are of course not limited to adding new control operators to a language. One can design his own little language for solving specific problems, like <a href="http://www.artisancoder.com/2008/04/dsls-are-cool/" title="DSLs are cool">stocks trading</a>. Or a data modelling language, a graphics drawing language etc. A language for object-oriented programming such as <a href="http://pagesperso-systeme.lip6.fr/Christian.Queinnec/WWW/Meroon.html" title="Meroon: an Object System in Scheme">Meroon</a> can be seamlessly embedded within Scheme. Paul Graham&#8217;s <a href="http://www.paulgraham.com/onlisp.html" title="On Lisp">On Lisp</a> book on advanced Common Lisp programming has several chapters devoted to macros. In short, the developer becomes almost as powerful as the language designer, and such distinction is blurred. Armed with such power, the developer becomes much more productive and, therefore, happy.</p>
<p>Unfortunately not many programming languages provide good macro facilities. The C preprocessor, for instance, only does textual replacement and is no aware of expressions. Granted, the syntax of the programming languages of the Lisp family is very simple and uniform, making better macros possible. Nevertheless other languages like <a href="http://www.haskell.org/haskellwiki/Template_Haskell" title="Template Haskell">Haskell</a> and <a href="http://brion.inria.fr/gallium/index.php/Camlp4" title="Camlp4">OCaml</a> with more complex syntax also provide such facilities.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2010/06/praising-macros/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apple relaxes restriction on interpreted code</title>
		<link>http://www.artisancoder.com/2010/06/apple-relaxes-restriction-on-interpreted-code/</link>
		<comments>http://www.artisancoder.com/2010/06/apple-relaxes-restriction-on-interpreted-code/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 17:31:11 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://www.artisancoder.com/?p=174</guid>
		<description><![CDATA[Apple&#8217;s iOS SDK license agreement terms have always been source of disputes, discussions and many blog posts. Many accuse Apple of being too draconian and elitist, while being ineffective at barring bad applications from entering the store. The uproar just got fueled when Apple released the 4.0 version of the SDK with a new license [...]]]></description>
			<content:encoded><![CDATA[<p>Apple&#8217;s iOS SDK license agreement terms have always been source of disputes, discussions and many blog posts. Many accuse Apple of being too draconian and elitist, while being ineffective at barring bad applications from entering the store. The uproar just got fueled when Apple released the 4.0 version of the SDK with a new license agreement, changing</p>
<blockquote>
<p>3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs.</p>
</blockquote>
<p>to</p>
<blockquote>
<p>3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).</p>
</blockquote>
<p>The intended effect is obviously to ban third-party abstraction layers, like then soon-to-be-released <a href="http://labs.adobe.com/technologies/flashcs5/appsfor_iphone/" title="Adobe Flash">Adobe&#8217;s Flash for iPhone</a>. But the wording is very broad and cover too many uses of other programming languages and technologies. Steve Jobs demoed himself the Tap Tap Revenge game for iPhone, which <a href="http://blog.anscamobile.com/2010/04/lua-the-lingua-franca-of-iphone-games/" title="Lua, the lingua franca of iPhone games">reportedly uses Lua</a>. The backslash was too big to ignore, making Apple revise the agreement again. This time section 3.3.2 was changed from</p>
<blockquote>
<p>3.3.2 &#8211; No interpreted code may be downloaded or used in an Application except for code that is interpreted and run by Apple’s Documented APIs and built-in interpreter(s).﻿</p>
</blockquote>
<p>to</p>
<blockquote>
<p>3.3.2 &#8211; Unless otherwise approved by Apple in writing, no interpreted code may be downloaded or used in an Application except for code that is interpreted and run by Apple’s Documented APIs and built-in interpreter(s). Notwithstanding the foregoing, with Apple’s prior written consent, an Application may use embedded interpreted code in a limited way if such use is solely for providing minor features or functionality that are consistent with the intended and advertised purpose of the Application.﻿</p>
</blockquote>
<p>Although still requiring Apple&#8217;s prior written approval, it leaves the door open for the use of other programming languages on iOS devices. Apple Outsider <a href="http://www.appleoutsider.com/2010/06/10/hello-lua/" title="Hello, Lua">believes</a> this is all about Lua, and he may be right. But of course Lua is not the only game in town.</p>
<p>I always thought <a href="http://www.artisancoder.com/2009/10/scheme-hits-the-app-store/" title="Scheme hits the App Store">my use of Scheme</a> in Reverso was ok with the previous version of the license agreement. No code is ever downloaded, and not interpreted either; Gambit-C compiles Scheme code to C which is compiled with Apple&#8217;s official tools to create a native library. But this changed with the new 3.3.1 section because my code was not originally written in one of the approved languages. <a href="http://jlongster.posterous.com/" title="jlongster’s posterous">James Long</a>, who first compiled Gambit-C for the iPhone, claimed that <a href="http://jlongster.com/blog/2010/04/09/scheme-dead-iphone/" title="Scheme is also dead on the iPhone">Scheme was dead on the iPhone</a>. But then Apple relented and changed section 3.3.2. What about now?</p>
<p>I believe that makes Scheme usable again, if used just like in Reverso: as a library. The application is written in Objective-C, but uses Scheme code (compiled to C) to only add features &#8220;that are consistent with the intended and advertised purpose of the Application&#8221;. Albeit it can be claimed that the code is not interpreted, this use follows the spirit of the law, even if it does not follow its letter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2010/06/apple-relaxes-restriction-on-interpreted-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Syntactic closures in Sly</title>
		<link>http://www.artisancoder.com/2010/05/syntactic-closures-in-sly/</link>
		<comments>http://www.artisancoder.com/2010/05/syntactic-closures-in-sly/#comments</comments>
		<pubDate>Mon, 10 May 2010 19:52:57 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[sly]]></category>
		<category><![CDATA[syntactic closures]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=159</guid>
		<description><![CDATA[Continuing my quest in mastering Scheme, I have completely revamped Sly&#8216;s front-end and implemented syntactic closures in the source code expander. The initial motivation was to get alpha-renamed identifiers as the result of the expansion phase, to make it easier to apply subsequent transformations on the source code (like Dybvig&#8217;s Fixing Letrec). But it was [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing my quest in mastering Scheme, I have completely revamped <a href="http://github.com/asandroq/sly" title="Sly Scheme">Sly</a>&#8216;s front-end and implemented <a href="http://community.schemewiki.org/?syntactic-closures" title="Syntactic Closures">syntactic closures</a> in the source code expander. The initial motivation was to get alpha-renamed identifiers as the result of the expansion phase, to make it easier to apply subsequent transformations on the source code (like Dybvig&#8217;s <a href="http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf" title="Fixing Letrec">Fixing Letrec</a>). But it was a worthy effort in itself. All previous derived syntax that was internally rewritten using <tt>gensym</tt> now is written using syntactic closures, making them clearer and much more robust because of the added hygiene.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2010/05/syntactic-closures-in-sly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Babel Syndrome</title>
		<link>http://www.artisancoder.com/2010/01/babel-syndrome/</link>
		<comments>http://www.artisancoder.com/2010/01/babel-syndrome/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 14:10:06 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Scheme]]></category>
		<category><![CDATA[r7rs]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[scheme]]></category>
		<category><![CDATA[standard]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=156</guid>
		<description><![CDATA[At this moment the groups that will bring us the seventh revision of the report on the algorithmic language Scheme (R7RS), which is going to be split in two, are being formed. I just hope that they keep in mind that even the gods will fear us if they succeed at producing a report (or [...]]]></description>
			<content:encoded><![CDATA[<p>At this moment the groups that will bring us the seventh revision of the report on the algorithmic language Scheme (R7RS), which is going to be split in two, are being formed. I just hope that they keep in mind that even the gods will fear us if they succeed at producing a report (or reports) that the vast majority of us like:</p>
<p>
<blockquote>
&#8220;If now, while they are one people, all speaking the same language, they have started to do this, nothing will later stop them from doing whatever they propose to do.&#8221; &#8211; Genesis XI, v.6
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2010/01/babel-syndrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scheme hits the App Store</title>
		<link>http://www.artisancoder.com/2009/10/scheme-hits-the-app-store/</link>
		<comments>http://www.artisancoder.com/2009/10/scheme-hits-the-app-store/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:32:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[othello]]></category>
		<category><![CDATA[reversi]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=123</guid>
		<description><![CDATA[I believe I have got the first Scheme application past Apple review into the iTunes App Store. It is yet another Reversi clone, called Reverso. It is a combination of 90% Scheme and 10% Objective-C, written with Gambit-C Scheme. James Long has already shown how to compile Gambit-C for the iPhone, and I started from [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.dunasystems.com.br/reverso/images/revlogo.png" alt="Reverso logo" style="float:left;padding:20px;" /></p>
<p>I believe I have got the first Scheme application past Apple review into the iTunes App Store. It is yet another <a href="http://en.wikipedia.org/wiki/Reversi" title="Reversi">Reversi</a> clone, called <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334979538&#038;mt=8" title="Reverso">Reverso</a>. It is a combination of 90% Scheme and 10% Objective-C, written with <a href="http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Main_Page" title="Gambit-C">Gambit-C Scheme</a>. James Long has already <a href="http://jlongster.com/blog/2009/06/17/write-apps-iphone-scheme/" title="Writing apps for the iPhone in Scheme">shown how to compile Gambit-C for the iPhone</a>, and I started from there. My Scheme code is compiled to C by Gambit and later by GCC to produce native ARM code, bundled in a static library, which is ok with the iPhone SDK license agreement. The Objective-C then calls the library as a pure C library. The Scheme code deals with position evaluation, alpha-beta pruning, transposition tables, move legality, different strategies and so on. The Objective-C code deals with sound, animations, GUI, user preferences, basically everything that calls the iPhone OS API. Reversi was chosen because I like strategy games and it is much more algorithmic than artistic, and I am no artist.</p>
<p>The performance of the code is excellent. I used some Gambit-specific declarations, only fixnum arithmetic, pre-allocated a large heap, and called the garbage-collector every time the user needed to think. The search is not memory intensive, but the transposition tables are. I did not write a specific hash function but relied on Gambit-C&#8217;s table type. The boards used during search were retrieved from a pool (the newest Gambit-C has made <tt>subu8vector-move!</tt> a public API), so they did not put pressure on the garbage-collector. In the end it was a very successful experiment. Developing with Scheme is orders of magnitude more productive than with most other languages. Gambit-C is also one of the best Scheme compilers out there, and made my job a lot easier.</p>
<p><strong>Update</strong>: There was a bug in the application that caused it to play poorly. The weak AI was not Gambit&#8217;s or Scheme&#8217;s fault, but mine. I already sent an updated version to Apple that will play much better. Besides fixing the bug, I am now using Zobrist&#8217;s hashing instead of Gambit&#8217;s own hash function, that performs poorly for game positions. It is still written in Scheme, though. Now I am waiting for the approval of the update, and to hear further feedback from my users. <img src='http://www.artisancoder.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2009/10/scheme-hits-the-app-store/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sly Scheme</title>
		<link>http://www.artisancoder.com/2009/09/sly-scheme/</link>
		<comments>http://www.artisancoder.com/2009/09/sly-scheme/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 17:29:12 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=119</guid>
		<description><![CDATA[&#8220;You think you know when you can learn, are more sure when you can write, even more when you can teach, but certain when you can program.&#8221; &#8211; Alan Perlis Just after have read Lisp in Small Pieces I felt the urge to write a Scheme compiler. This sentiment is common in the Lisp community, [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;You think you know when you can learn, are more sure when you can write, even more when you can teach, but certain when you can program.&#8221; &#8211; Alan Perlis</p>
</blockquote>
<p>Just after have read <a href="http://pagesperso-systeme.lip6.fr/Christian.Queinnec/WWW/LiSP.html" title="Lisp in Small Pieces">Lisp in Small Pieces</a> I felt the urge to write a Scheme compiler. This sentiment is common in the Lisp community, I guess. There are dozens of Scheme systems, some good, some bad, some maintained, some abandoned. There are large optimising compilers and small interpreters for embedded systems. But I, well, <strong>needed</strong> to know. I needed to know how to write a program that takes another as input and generates simple instructions that do the same computation. I needed to know how to a write a program that interprets those instructions, a runtime to provide primitives, a garbage collector to manage memory etc. So I started doing some coding in my spare time, and called the monster <em>Sly Scheme</em>.</p>
<p>I failed miserably. I began with the reader, believing that basic I/O was fundamental for a REPL (the REPL was the goal I set myself to achieve). The reader was growing too complex and my interest simply disappeared. Then I focused on the types, creating a large hierarchy of them, only to lose interest again. After some time I came across Abdulaziz Ghuloum&#8217;s <a href="http://lambda-the-ultimate.org/node/1752" title="An Incremental Approach to Compiler Construction">An Incremental Approach to Compiler Construction</a>, which starts with the compiler itself. Let another Scheme do the I/O! I then took this path, running my compiler with Gambit-C. But instead of generating machine code, it generated instructions for a virtual machine. I then proceeded in lockstep: Wrote in Scheme a new compiler feature, and then in C just enough to interpret the new instructions. Finally most of R4RS Scheme is compilable. Then I wrote a simple stop-and-copy garbage collector with two semi spaces. After that, I needed a runtime with enough procedures to run the compiler without Gambit-C. Almost an year later, I have my REPL (I am not that bad as a programmer, but this is just a hobby that I do in my spare time).</p>
<p>The code now sits in a <a href="http://github.com/asandroq/sly" title="Sly in Github">Github repository</a>. For those who cares to check it out, I must warn that everything was done as simplistic as possible, so I could have a working interpreter ASAP. Some things were even done outright stupidly. The compiler generates too many closures, it fails with simple cases, the VM uses a giant switch, it is slow, the garbage collector too etc. I probably will hack this code for the years to come, even if only as a hobby of mine. But the most important contribution of this project is how much I have been learning from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2009/09/sly-scheme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escape from Zurg</title>
		<link>http://www.artisancoder.com/2009/08/escape-from-zurg/</link>
		<comments>http://www.artisancoder.com/2009/08/escape-from-zurg/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 17:16:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.ventonegro.org/?p=114</guid>
		<description><![CDATA[Lately I have been reading about searching in game trees. So a friend of mine sent me the &#8220;Escape from Zurg&#8221; paper, which talks about problem solving by tree searching with Haskell. In a large class of problems one is given a start state and some predicate for a desired final state. Moreover, the rules [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been reading about searching in <a href="http://en.wikipedia.org/wiki/Game_tree" title="Game tree">game trees</a>. So a friend of mine sent me the <a href="http://web.engr.oregonstate.edu/~erwig/papers/Zurg_JFP04.pdf" title="Escape from Zurg">&#8220;Escape from Zurg&#8221; paper</a>, which talks about problem solving by tree searching with Haskell.</p>
<p>In a large class of problems one is given a start state and some predicate for a desired final state. Moreover, the rules that dictate how a successor state is generated from a previous one are also given. Take a board game for instance, like tic-tac-toe. There is the initial state (which is the empty board), the predicate for a desired state (a state in which tree pieces of mine are aligned), and rules to create one state from another (the rules of the game). Another example of such problems is the &#8220;Escape from Zurg&#8221; one, that is stated as follows:</p>
<blockquote>
<p>Buzz, Woody, Rex, and Hamm have to escape from Zurg. They merely have to cross one last bridge before they are free. However, the bridge is fragile and can hold at most two of them at the same time. Moreover, to cross the bridge a flashlight is needed to avoid traps and broken parts. The problem is that our friends have only one flashlight with one battery that lasts for only 60 minutes (this is not a typo: <em>sixty</em>). The toys need different times to cross the bridge (in either direction):</p>
<table>
<tbody>
<tr>
<th>TOY</th>
<th>TIME</th>
</tr>
<tr>
<td>Buzz</td>
<td>5 minutes</td>
</tr>
<tr>
<td>Woody</td>
<td>10 minutes</td>
</tr>
<tr>
<td>Rex</td>
<td>20 minutes</td>
</tr>
<tr>
<td>Hamm</td>
<td>25 minutes</td>
</tr>
</tbody>
</table>
<p>Since there can be only two toys on the bridge at the same time, they cannot cross the bridge all at once. Since they need the flashlight to cross the bridge, whenever two have crossed the bridge, somebody has to go back and bring the flashlight to those toys on the other side that still have to cross the bridge. The problem now is: In which order can the four toys cross the bridge in time (that is, in 60 minutes) to be saved from Zurg?</p>
</blockquote>
<p>This class of problems is usually solved by searching. The initial state and all the successors ultimately build a DAG (directed acyclic graph) that is called the <em>search space</em>. Some search spaces are small, like tic-tac-toe playing or even the &#8220;Escape from Zurg&#8221; puzzle. Others are large, like playing Reversi; even larger, like playing Chess; others are infinite. Needless to say that that are better searching ways than others. This same puzzle, for instance, <a href="http://benjisimon.blogspot.com/2008/04/escape-from-zurg-scheme-solution.html" title="Escape From Zurg - A Scheme Solution">was solved in Scheme</a> by Ben Simon using the cool <tt>amb</tt> operator. The <tt>amb</tt> operator uses first-class continuations to backtrack and take another path in case the first one fails. It was an elegant solution for this puzzle, but it is not adequate for general searching because it backtracks blindly. There are others ways to search blindly, for instance <em>depth-first search</em> and <em>breadth-first search</em>.</p>
<p>In a depth-first search, we analyse the successors of a given state until there are no more successors to analyse, and then backtrack to a previous level of the tree. In a breadth-first search, we analyse the whole fringe of the tree (the <em>horizon nodes</em>) before expanding it one level further using the successor rules. This is good for infinite search spaces, because we will eventually find a solution if there is one. The implementation in Scheme is straightforward:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1">&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>depth<span class="sy0">-</span>first states successors goal?<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> states<span class="br0">&#41;</span>
      #f
      <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>state <span class="br0">&#40;</span><span class="kw1">car</span> states<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>goal? state<span class="br0">&#41;</span>
            state
            <span class="br0">&#40;</span>depth<span class="sy0">-</span>first <span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span>successors state<span class="br0">&#41;</span>
                                 <span class="br0">&#40;</span><span class="kw1">cdr</span> states<span class="br0">&#41;</span><span class="br0">&#41;</span>
                         successors
                         goal?<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>breadth<span class="sy0">-</span>first states successors goal?<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> states<span class="br0">&#41;</span>
      #f
      <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>state <span class="br0">&#40;</span><span class="kw1">car</span> states<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>goal? state<span class="br0">&#41;</span>
            state            
            <span class="br0">&#40;</span>breadth<span class="sy0">-</span>first <span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span><span class="kw1">cdr</span> states<span class="br0">&#41;</span>
                                   <span class="br0">&#40;</span>successors state<span class="br0">&#41;</span><span class="br0">&#41;</span>
                           successors
                           goal?<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>This is actually all we need for simple searches. Of course we need to supply the initial state, the procedure that generates successors and the goal predicate. These are specific for each kind of problem. Let&#8217;s see the Zurg problem procedures:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1">&nbsp;
<span class="co1">;; the type of the states found in our puzzle</span>
<span class="br0">&#40;</span>define<span class="sy0">-</span>type state
  <span class="br0">&#40;</span>previous unprintable:<span class="br0">&#41;</span>       <span class="co1">;; previous state</span>
  near                          <span class="co1">;; toys in near shore</span>
  far                           <span class="co1">;; toys in far shore</span>
  flashlight                    <span class="co1">;; location of flashlight</span>
  time<span class="br0">&#41;</span>                         <span class="co1">;; time consumed so far</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>start<span class="sy0">-</span>state<span class="br0">&#41;</span>
  <span class="br0">&#40;</span>make<span class="sy0">-</span>state #f
              '<span class="br0">&#40;</span>buzz woody rex hamm<span class="br0">&#41;</span>
              '<span class="br0">&#40;</span><span class="br0">&#41;</span>
              'near
              <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>final<span class="sy0">-</span>state? state<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span class="kw1">null?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>near state<span class="br0">&#41;</span><span class="br0">&#41;</span>
       <span class="br0">&#40;</span><span class="sy0">&lt;=</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>time state<span class="br0">&#41;</span> <span class="nu0">60</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1">;; at most two toys can travel across the bridge</span>
<span class="co1">;; the flashlight must be used in all crossings</span>
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>successors state<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>orig <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>flashlight state<span class="br0">&#41;</span>
                        'near<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>near state<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>far state<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span>dest <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>flashlight state<span class="br0">&#41;</span>
                        'near<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>far state<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>near state<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">map</span> <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>toy<span class="sy0">-</span>pair<span class="br0">&#41;</span>
           <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>toy1 <span class="br0">&#40;</span><span class="kw1">car</span> toy<span class="sy0">-</span>pair<span class="br0">&#41;</span><span class="br0">&#41;</span>
                 <span class="br0">&#40;</span>toy2 <span class="br0">&#40;</span><span class="kw1">cdr</span> toy<span class="sy0">-</span>pair<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
             <span class="br0">&#40;</span>make<span class="sy0">-</span>next<span class="sy0">-</span>state state
                              <span class="br0">&#40;</span>remove toy2
                                      <span class="br0">&#40;</span>remove toy1 orig<span class="br0">&#41;</span><span class="br0">&#41;</span>
                              <span class="br0">&#40;</span>ucons toy1
                                     <span class="br0">&#40;</span><span class="kw1">cons</span> toy2 dest<span class="br0">&#41;</span><span class="br0">&#41;</span>
                              <span class="br0">&#40;</span><span class="kw1">max</span> <span class="br0">&#40;</span>time<span class="sy0">-</span>cost toy1<span class="br0">&#41;</span>
                                   <span class="br0">&#40;</span>time<span class="sy0">-</span>cost toy2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
         <span class="br0">&#40;</span>product orig orig<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>The previous procedures use some utilities:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1">&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>make<span class="sy0">-</span>next<span class="sy0">-</span>state state orig dest time<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>flashlight state<span class="br0">&#41;</span> 'near<span class="br0">&#41;</span>
      <span class="br0">&#40;</span>make<span class="sy0">-</span>state state orig dest 'far <span class="br0">&#40;</span><span class="sy0">+</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>time state<span class="br0">&#41;</span> time<span class="br0">&#41;</span><span class="br0">&#41;</span>
      <span class="br0">&#40;</span>make<span class="sy0">-</span>state state dest orig 'near <span class="br0">&#40;</span><span class="sy0">+</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>time state<span class="br0">&#41;</span> time<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1">;; the time each toy takes to cross the bridge</span>
<span class="br0">&#40;</span><span class="kw1">define</span> time<span class="sy0">-</span>cost
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>costs '<span class="br0">&#40;</span><span class="br0">&#40;</span>buzz . <span class="nu0">5</span><span class="br0">&#41;</span>
                 <span class="br0">&#40;</span>woody . <span class="nu0">10</span><span class="br0">&#41;</span>
                 <span class="br0">&#40;</span>rex . <span class="nu0">20</span><span class="br0">&#41;</span>
                 <span class="br0">&#40;</span>hamm . <span class="nu0">25</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>toy<span class="br0">&#41;</span>
      <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>pair <span class="br0">&#40;</span><span class="kw1">assv</span> toy costs<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">and</span> pair
             <span class="br0">&#40;</span><span class="kw1">cdr</span> pair<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>ucons a b<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">memv</span> a b<span class="br0">&#41;</span>
      b
      <span class="br0">&#40;</span><span class="kw1">cons</span> a b<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>product lis1 lis2<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> lp1 <span class="br0">&#40;</span><span class="br0">&#40;</span>lis1 lis1<span class="br0">&#41;</span>
            <span class="br0">&#40;</span>res '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> lis1<span class="br0">&#41;</span>
        res
        <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>i1 <span class="br0">&#40;</span><span class="kw1">car</span> lis1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
          <span class="br0">&#40;</span><span class="kw1">let</span> lp2 <span class="br0">&#40;</span><span class="br0">&#40;</span>lis2 lis2<span class="br0">&#41;</span>
                    <span class="br0">&#40;</span>res res<span class="br0">&#41;</span><span class="br0">&#41;</span>
            <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> lis2<span class="br0">&#41;</span>
                <span class="br0">&#40;</span>lp1 <span class="br0">&#40;</span><span class="kw1">cdr</span> lis1<span class="br0">&#41;</span> res<span class="br0">&#41;</span>
                <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>i2 <span class="br0">&#40;</span><span class="kw1">car</span> lis2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                  <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">member</span> <span class="br0">&#40;</span><span class="kw1">cons</span> i2 i1<span class="br0">&#41;</span> res<span class="br0">&#41;</span>
                      <span class="br0">&#40;</span>lp2 <span class="br0">&#40;</span><span class="kw1">cdr</span> lis2<span class="br0">&#41;</span> res<span class="br0">&#41;</span>
                      <span class="br0">&#40;</span>lp2 <span class="br0">&#40;</span><span class="kw1">cdr</span> lis2<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cons</span> <span class="br0">&#40;</span><span class="kw1">cons</span> i1 i2<span class="br0">&#41;</span> res<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Our <tt>successors</tt> procedure does not take time in account. So it is possible for a branch of the tree to go on indefinitely. To guarantee that we will arrive at a solution, we use a breadth-first search:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1">&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>print<span class="sy0">-</span>path state<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> loop <span class="br0">&#40;</span><span class="br0">&#40;</span>state state<span class="br0">&#41;</span>
             <span class="br0">&#40;</span>path '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span><span class="kw1">if</span> state
        <span class="br0">&#40;</span>loop <span class="br0">&#40;</span>state<span class="sy0">-</span>previous state<span class="br0">&#41;</span>
              <span class="br0">&#40;</span><span class="kw1">cons</span> state path<span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span><span class="kw1">for-each</span> println path<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span>print<span class="sy0">-</span>path <span class="br0">&#40;</span>breadth<span class="sy0">-</span>first <span class="br0">&#40;</span><span class="kw1">list</span> <span class="br0">&#40;</span>start<span class="sy0">-</span>state<span class="br0">&#41;</span><span class="br0">&#41;</span> successors final<span class="sy0">-</span>state?<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>With the result:</p>
<pre>
#&lt;state #14 near: (buzz woody rex hamm) far: () flashlight: near time: 0&gt;
#&lt;state #15 near: (rex hamm) far: (buzz woody) flashlight: far time: 10&gt;
#&lt;state #16 near: (woody rex hamm) far: (buzz) flashlight: near time: 20&gt;

#&lt;state #17 near: (woody) far: (rex hamm buzz) flashlight: far time: 45&gt;
#&lt;state #18 near: (buzz woody) far: (rex hamm) flashlight: near time: 50&gt;
#&lt;state #19 near: () far: (buzz woody rex hamm) flashlight: far time: 60&gt;
</pre>
<p>If we change our <tt>successors</tt> procedure a little, we can use depth-first search:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="scheme"><pre class="de1">&nbsp;
<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>successors2 state<span class="br0">&#41;</span>
  <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>orig <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>flashlight state<span class="br0">&#41;</span>
                        'near<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>near state<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>far state<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#40;</span>dest <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>flashlight state<span class="br0">&#41;</span>
                        'near<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>far state<span class="br0">&#41;</span>
                  <span class="br0">&#40;</span>state<span class="sy0">-</span>near state<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#40;</span>filter <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span><span class="kw1">s</span><span class="br0">&#41;</span>
              <span class="br0">&#40;</span><span class="sy0">&lt;=</span> <span class="br0">&#40;</span>state<span class="sy0">-</span>time <span class="kw1">s</span><span class="br0">&#41;</span> <span class="nu0">60</span><span class="br0">&#41;</span><span class="br0">&#41;</span>          <span class="co1">;; filtering out bad states</span>
            <span class="br0">&#40;</span><span class="kw1">map</span> <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>toy<span class="sy0">-</span>pair<span class="br0">&#41;</span>
                   <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>toy1 <span class="br0">&#40;</span><span class="kw1">car</span> toy<span class="sy0">-</span>pair<span class="br0">&#41;</span><span class="br0">&#41;</span>
                         <span class="br0">&#40;</span>toy2 <span class="br0">&#40;</span><span class="kw1">cdr</span> toy<span class="sy0">-</span>pair<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                     <span class="br0">&#40;</span>make<span class="sy0">-</span>next<span class="sy0">-</span>state state
                                      <span class="br0">&#40;</span>remove toy2
                                              <span class="br0">&#40;</span>remove toy1 orig<span class="br0">&#41;</span><span class="br0">&#41;</span>
                                      <span class="br0">&#40;</span>ucons toy1
                                             <span class="br0">&#40;</span><span class="kw1">cons</span> toy2 dest<span class="br0">&#41;</span><span class="br0">&#41;</span>
                                      <span class="br0">&#40;</span><span class="kw1">max</span> <span class="br0">&#40;</span>time<span class="sy0">-</span>cost toy1<span class="br0">&#41;</span>
                                           <span class="br0">&#40;</span>time<span class="sy0">-</span>cost toy2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                 <span class="br0">&#40;</span>product orig orig<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span>print<span class="sy0">-</span>path <span class="br0">&#40;</span>depth<span class="sy0">-</span>first <span class="br0">&#40;</span><span class="kw1">list</span> <span class="br0">&#40;</span>start<span class="sy0">-</span>state<span class="br0">&#41;</span><span class="br0">&#41;</span> successors2 final<span class="sy0">-</span>state?<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>The advantage of changing the successors procedure is that depth-first searches are usually faster than breadth-first searches, in this case 483ms vs. 24630ms. Also, it uses less memory. So it is always a good idea to try to cut the search space as soon as possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artisancoder.com/2009/08/escape-from-zurg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

