git » homepage.git » master » tree

[master] / OUT / Lisp / CommonLispIteration.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Common Lisp iteration</title>
	<meta name='Generator' content='Zim 0.75.2'>
  <script async src="https://www.googletagmanager.com/gtag/js?id=G-XCMVL5K44X"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'G-XCMVL5K44X');
  </script>
	<style type='text/css'>
    body {
        background-image: url(data:image/png;base64,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);
    }
    div#main {
        margin: 40px auto;
        max-width: 800px;
        line-height: 1.4;
        font-size: 1.1em;
        padding: 1em;
        box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
        border-radius: 0.75em;
        background-color: white;
    }
    img[src*="float_right"] {
      float: right;
      border-radius: 0.75em;
    }
    img[src*="200px"] {
      width: 200px;
    }
		strike     { color: grey                }
		u          { text-decoration: none;
					 background-color: yellow   }
		tt         { color: #2e3436;            }
		pre        { color: #2e3436;
					 margin-left: 20px          }
		h1,h2,h3,h4,h5 {
				color: #cc3b12;
        margin: 0 auto;
    }
		p          { margin-top: 0              }
		span.zim-tag {
			color: #ce5c00;
		}
		div.zim-object {
			border-style:solid;
			border-width:1px;
		}
		.checked-box {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAANOgAADMQBiN+4gQAAAAd0SU1FB9gKGQ8sMEGsKGkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAEBUlEQVRIx62V22tdRRTGf7Nn73P2ybntnNOe3NqkPTGgLTVUUZF6QatSLOKTPgqCIqLgQ0H/A1sQQbBYCBb1QfAxiC8tSO1FqHkwJVKtjdTGNraUmObsc9nXmfGh7cGYpM1D5nHWzPetteZb3wg2eB2YqYm4zSadsMtoboiNBH/3TE0awx6j+MRoxoTg/IYRvP19TQrJS0bzhdHGSyKFkLTtjSKwMjyiEz43ynhtP6bdjBCWyFobAf7eT7VhNF/q1FRbjYjmUohlCVPwnB+6FUxMTJipqSmUUhhjEGKd3bMT4ks/Y6oLBK2Yth8hHYtCJXOix7Nf7xLMzc0xOzvLzp078TyPNE3viW3QJPXzhNWbxFFKHCmMhoLn/FHodd48vGfhapdAacXQlkFK5dL6wIUm6fuTZPuvqDQhaMUYYyiVyuQr6rXDexYuAdi3tSv1ZJNs/R/CaszzT+1na88uXFnCEnJVgivBNN8uTJKmHQI/ptOOcXNZzMz9mOqFs90OHpipWcYwlo5P4ebnuOkrvr5wgrH+h3im7y36MzuwRXYZeKha/OhP0EkadFoxQSdGSotedR/+XwMc2XvKdNUFOFqZx6LKZWIiwjgkikNmLp/hm8sH+K1zjFTHXfBYdTi+eJArzXM0GxFxoBDCopLvo/fqEwi1XPkWkGqjFo2TgB1jOYZUKZTS/D1/ncmLh7jon0IbRWoiTi59ymzzJEEQE3cStNZsGxqlfPE57MBbOR8fP3hDGalOO9fq2DlBvmZw8xa2IxACGn6TydlD/O6f5OzSV/zif0cYhLQaEXGkKBbz7Ov/AOlXV1cxgBJRI3fuSTrpTawt18kWIZN1CFuaONI0w0WOXfsI43YIggh/KUSlhqxrMz74AkOZcWBm9QkH+Gw8NDLuITi+m0yzhluSyJzBLcpblUhFxywSRAEtPwQjsKVN30CNh0uvYuOubSHLtN3J0TO1j0pmBNuFbFWRK0gyPRZpktL2I5JQkclKakNlnh54g6ocvevUr/Ai2a7wineEkcJupA3S1Wg0nVZM2E6wbEF5U5G9Q++wI7sfR7h3N8HVNstykBfzH+KJEZwiWD0aIwxCgJ0R1Mu7GXOeJSuK93bZtQIle4D9pUNU5DC5jEsu55AvZakM5NicGyEj8uuz8bUCQgj67QfY671P3vEoeC69gy695U1U7NG7XV0pUwBjDJa1/JJlWWxzHuflzQe5FJ/GsgUVuZ2t8lEkTvfc0aNHb72flBhjVicQQqCUuvM3/M+WDVguWBrMVdDXEGZlBVEUrVCU9d9s5+fnaTQa2PZyPxEIhJaI1EEoZwX4ncynp6fXrmB4eJjR0VFarRbNZnP9P9rt9gohqNVq1Ov1ZbF/AZGev3hLJ2/zAAAAAElFTkSuQmCC)}
		.xchecked-box {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAANOgAADMQBiN+4gQAAAAd0SU1FB9gKGQ8bDYnDxEwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAEK0lEQVRIx9WVS2hTWRjHf/eR3CY1nbxMH2YiZRQS6qO13YlMVxY3SnVcuNIBFezGpSADLoQqLu1sHJCqdCFSXFpw4YOCSH3BtFqttTNamabX3DS5bfO6uffMoglja3RGcDMHzuac7/z/53++//cd+L8P6VuCPQYZ8ADNgBd4J31DcDcQs+GnHByRocEDv0kfBSjAOlYCs11Q+gpwDegS8LMJ+3QIK0ATzEhV8Odnz5bzw8P4dJ25aJQ/WlvJ1df/K7hSLtOcTNI+Pk69rpMTgqIQhCDvh1/VSpw79+gRrRMTmLZNezLJJsPg+a5dmOEwQlFqg1sWG16/Jv7sGWXDwBACFQjC9HcwIMONKkGp4PGAJGEDS0IQmZlhnWnye3c3eiyGo6qr3WHbrJ+dJf7gAXI6zSIr72T7/fgzmT4FHnTBsgrQBfYvTU0km5vxz86iADnAm0rRPTWFt7cXZccOJJcLAGHb2K9ekT93jmwmwwdAAFpjI6Ntbfxw5879ag7l6o1sr5eHHR3IsRgeQK/M4sQE+YEB7JcvEY6zAj45SWFgAPPxYwzHoQxIkQjTPT0kIxE+Noj8sexFn4/xnh58iQTeSpHkHAdrbIzi0BCOrmNPTpK/eJHM3bt8sCyKQCiR4NWePWSiUZw1+ZLXJm4pFKLhzBlCsRh2RUXacVgeGaF47RrL58+zcP8+RrmMkCQinZ1EL1zAjERqmkH+tLYl1G3bCJw4QUjT0IA0MJfLMX/5MqmHD0nZNiUgtGULG/r7ccXjINWuWbnmqsuFu7sb/4EDNLlcBIEioNs2KUAFGmMxmk6dQm1tRZI+3xBqEkiShBQOox05Ql1nJ26gvuIUAWiKQnj/ftStW5Fk+YuF+NldsbBA4cYN9KdPmaso8Fc62ZJtk7l1C2t0FGdxESHE1xE4hkHh6lX0oSHSpRIewC/LrPf7CSgKNpCamkI/fZr8pUuIZBIcpyaBunahPp1mub+fDyMjGKUSChCsq6Nh717q9u2jbnSU0uAgRrFIwTThyhUCqRS+hgZKLS1fJvDm87SNjZGcnsYUAjcQ8vsJ9/Xh7u1FDgRQN20iks3iDA+zZFmYhQLqzZtsj8WY3L0baY2Sf55ICCKpFHUzM2SEQAJCHg+hY8fQDh5EDgRWDoRC1J88SePRo2geD0XAcBy8b98Sv3ePYDZbbf2rFQjLIphMsmDbaEBQVQkePox26BCSz7e6i4bDrDt+nGYhmBscpFAskheC4Js3bPR4qHphFYEnlcI7P4/jdqNpGu8TCe4oCsXr1z//F2ga3+/cSfTJE0qmSVYIsKzaOZDcbjKyzFIiwfvt21kMBLA07YsetzWNd+3tLLW0sH5igvT8PH9Go/z44kX+E4LGjg7GDYOcy4XlOEgLC//5P/5LCFzxOPLmzWyIx+m6fduu7v0NVGqyTSycKksAAAAASUVORK5CYII=)}
		.unchecked-box {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAANOgAADMQBiN+4gQAAAAd0SU1FB9gKGQ8qAt8h3m8AAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAA60lEQVRIx+2VsQqDMBRF70sCLg5OLoKgjk7+lJ/hh+STXBwcnRz8ArMEkrxOFktbaC3tULzTg5e8k5vADXDq70VbobXmvu/hvQczg4heHrJfXxQFuq67blZbMc8zpmlCXddIkgTOuZcBUko45zCOI6y1Nz2xFSEEZFmGOI7fGg4A3nsQEZqmuXOu9jallACAtm3fvmutNaIoAjM/dkBECCF89KCbk4eAb+kEnIAT8EsAM0OIz3hSyrssUvss8t5fg+uIrLXPs0gIgWVZYIyBUurQyYdheO4gz3NUVQVjDNZ1PfSjpWmKsixvehfB9GBZ3NndrgAAAABJRU5ErkJggg==)}
		.migrated-box {list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAANOgAADMQBiN+4gQAAAAd0SU1FB+AKHREFA8vJSnkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAC1klEQVRIx+2VT0hUURTGf/e958w4Tc3TYowMw1GyEgwr1MqsFmbZIrIWQZsWJUjbdoHQpl3Qps0swnCRECQFYkR/TC1iKkqmfzAKTo2Vf8hoRsfR995tkRMT87RRWkUHHhy495zvnvvu933wP/75EKkkEAjIYDCIaZpIKRFCZN0kfX9xcTGtra2/irVUEolECIfDlJeXo+s6hmFkDaCqKoZhEAqFSCaTv60pqcSyLAoLC/F4PEtqDmCaJkIIKisrMybX0sdUVRWA5ubmPzdNjjI1cpXkZC/O1fV03PXgdDqRUtpPIITAsqxsDz0Z/3CZQv8uqo4N4C8/Tp2/DdM0MiZQlvk41OTkI/LW1SGtCVb5drD3eCc71wcA+VcAHA5vDd8+3UGakxiJV7i9pdQevU5T1R35pJ3MV5QW1pf+0kWBheJ2SWua8EQXZXsu4fVVYEz1sEKvof5EuxjoPvzpcRvrdp9C2gGMx6cpOHBmbImMesds7BZubwMVDTfXDnQ3vQfK7AC8wLfExMX5whyQc3q2OEnjGm5vE76SQxsfBLr77a7CNf+n0r/l6sSMtsBSnurckiIILCobAtVZhpF4gZF4jubaymj4Ch/fd380LE7bAnjc0NPxk2yqpmEuwGxF0ag+0k5uTpzZeBeaazvj0We8fXojainsb2xh2BZgbe0gSIllzSIUh63wfQ6dZ/O2fbjcKlOj58jJ3cVENESw5yErc9nf2MLQ4jwQAkV1Lqiq37/cZ9WaahJjF9AcmxiPDhLs7ePe23oOnmUwg2hSShQle96tKDjA2HAniusgo9FxnvY9Jxw7RWzGYy92QghM00x5g53qp9sHmtB58/o2umOI2NwGolMnMYUHIb7aAyiKwsjICLqu2/qBEIKUUAohMaSHSLyBSMoPTINQ6CX5+fn2AEVFRZSUlBCPx4nFYhl3L4RESjF/GEgX3pSj+Xw+/H7/b3U/AEOZFnp7O5+5AAAAAElFTkSuQmCC)}
		ul {list-style-image: none}
		/* ul rule needed to reset style for sub-bullets */
	</style>
</head>
<body>
  <div id="main">
<!-- Header -->
<div>
[ <a href='../Home.html'>Home</a> ]
[ <a href='../Index.html'>Index</a> ]
</div>

<hr />

<!-- Wiki content -->

<div class='pages'>
	<div class='heading'>
	<h1>Common Lisp iteration <a name='Lisp:CommonLispIteration'></a></h1>
	</div>

	<div class='content Lisp:CommonLispIteration'>
	<p>
Created Monday 23 November 2020
</p>
<br>
<p>
Each of the following definitions of a <a href="https://en.wikipedia.org/wiki/Factorial" title="factorial" class="https">factorial</a> function demonstrate a way to <a href="https://en.wikipedia.org/wiki/Iteration#Computing" title="iterate" class="https">iterate</a> in <a href="https://en.wikipedia.org/wiki/Common_Lisp" title="Common Lisp" class="https">Common Lisp</a>, with brief notes. I hope that by demonstrating many different ways that the same thing can be written, you can develop a sense for the character of the constructs afforded by the language, and of the variety of possible styles. Common Lisp is famously syntactically extensible via <a href="https://en.wikipedia.org/wiki/Common_Lisp#Macros" title="macros" class="https">macros</a>, so keep in mind that my examples are by no means the <i>only</i> ways to iterate.
</p>
<br>
<p>
For further reading on the iteration and control structures of Common Lisp, I heartily recommend:
</p>
<br>
<ul>
<li><a href="http://www.gigamonkeys.com/book/macros-standard-control-constructs.html" title="Chapter 7" class="http">Chapter 7</a> and <a href="http://www.gigamonkeys.com/book/loop-for-black-belts.html" title="Chapter 22" class="http">Chapter 22</a> of <a href="https://amzn.to/3nOWKa2" title="Practical Common Lisp" class="https">Practical Common Lisp</a> by Peter Siebel.</li>
<li>A reasonably-priced used copy of <a href="https://amzn.to/2UUTfm3" title="ANSI Common Lisp" class="https">ANSI Common Lisp</a> by Paul Graham.</li>
</ul>
<br>
<p>
<i>Note: several of the examples return nonsensical results for negative inputs. The addition of <tt>(assert (not (minusp n)) </tt>or similar is a good idea, but I have omitted it here for clarity.</i>
</p>
<br>
<h2>DOTIMES<a id="dotimes" class="h_anchor"></a></h2>
<pre>
(defun factorial-dotimes (n &amp;aux (prod 1))
  (dotimes (i n prod)
    (setq prod (* prod (1+ i)))))
</pre>
<br>
<ul>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_dae.htm" title="&amp;aux lambda list keyword" class="http"><tt>&amp;aux</tt> lambda list keyword</a> names a local variable <tt>prod</tt>. <a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_let_l.htm" title="LET" class="http"><tt>LET</tt></a> could also be used for this purpose, but at the cost of more indentation.</li>
<li><a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/m_dotime.htm" title="DOTIMES" class="http"><tt>DOTIMES</tt></a> binds <tt>i</tt> successively from 0 to 1-n and finally evaluates to <tt>prod</tt>.</li>
</ul>
<br>
<h2>DO<a id="do" class="h_anchor"></a></h2>
<pre>
(defun factorial-do (n)
  (do ((i 1 (1+ i))
       (prod 1 (* prod i)))
      ((&gt; i n) prod)))
</pre>
<br>
<ul>
<li><a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/m_do_do.htm" title="DO" class="http"><tt>DO</tt></a> binds <tt>i</tt> to 1 and then to (1+ i) in subsequent iterations. <tt>prod</tt> is bound first to 1 and then to <tt>(* prod i)</tt> in subsequent iterations.</li>
<li>When the test clause <tt>(&gt; i n)</tt> becomes true, <tt>prod</tt> is returned. Contrast with the test clause of <tt>for</tt> loops in other languages, which terminate the loop when they become <i>false</i>.</li>
<li>I like the way Paul Graham explains <tt>DO </tt>and<tt> DO*</tt> in <a href="https://amzn.to/2UUTfm3" title="ANSI Common Lisp" class="https">ANSI Common Lisp</a>.</li>
</ul>
<br>
<h2>LOOP<a id="loop" class="h_anchor"></a></h2>
<pre>
(defun factorial-loop (n)
  (loop
     for i from 1 to n
     for prod = 1 then (* prod i)
     finally (return prod)))
</pre>
<br>
<ul>
<li><tt>i</tt> is bound from 1 to <tt>n</tt> inclusive.</li>
<li><tt>prod</tt> is bound to 1 and then <tt>(* prod i)</tt> in subsequent iterations in a manner similar to <tt>DO</tt>.</li>
<li>In the <tt>finally</tt> clause, <tt>prod</tt> is returned by <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/m_return.htm#return" title="RETURN" class="http"><tt>RETURN</tt></a> once iteration is complete. The <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/s_block.htm#block" title="BLOCK" class="http"><tt>BLOCK</tt></a> named NIL established by <tt>LOOP</tt> is the point of return.</li>
<li><a href="http://www.lispworks.com/documentation/lw50/CLHS/Body/m_loop.htm" title="LOOP" class="http"><tt>LOOP</tt></a> supports a comprehensive iteration and accumulation <a href="https://en.wikipedia.org/wiki/Domain-specific_language" title="DSL" class="https">DSL</a>. <a href="http://www.gigamonkeys.com/book/loop-for-black-belts.html" title="Chapter 22" class="http">Chapter 22</a> of <a href="https://amzn.to/3nOWKa2" title="Practical Common Lisp" class="https">Practical Common Lisp</a> offers a great introduction.</li>
</ul>
<br>
<p>
The preceding example demonstrates the "extended" form of <tt>LOOP</tt>. There's also "simple" form:
</p>
<br>
<pre>
(defun factorial-simple-loop (n &amp;aux (i 0) (prod 1))
  (loop
    (when (eql i n)
      (return prod))
    (setq prod (* prod (incf i)))))
</pre>
<br>
<h2>Recursion<a id="recursion" class="h_anchor"></a></h2>
<pre>
(defun factorial-recursive (n)
  (if (zerop n)
      1
      (* n (factorial-recursive (1- n)))))
</pre>
<br>
<ul>
<li><tt>FACTORIAL-RECURSIVE</tt> calls itself, but when <tt>n</tt> exceeds the maximum stack size supported by the implementation, an error is signaled.</li>
</ul>
<br>
<pre>
(defun factorial-tail-recursive (n)
  (labels ((recur (n prod)
             (if (zerop n)
                 prod
                 (recur (1- n) (* n prod)))))
    (recur n 1)))
</pre>
<br>
<ul>
<li><tt>FACTORIAL-TAIL-RECURSIVE </tt>does not call itself directly.</li>
<li>Instead, it defines with <a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_flet_.htm" title="LABELS" class="http"><tt>LABELS</tt></a> an internal and recursive helper function, <tt>recur</tt>.</li>
<li>recur <a href="https://en.wikipedia.org/wiki/Tail_call" title="calls itself in tail position" class="https">calls itself in tail position</a> and the stack never overflows in implementations that implement tail-call elimination.</li>
</ul>
<br>
<pre>
(defun factorial-tail-recursive-opt (n &amp;optional (prod 1))
  (if (zerop n)
      prod
    (factorial-tail-recursive-opt (1- n) (* n prod))))
</pre>
<br>
<br>
<ul>
<li><tt>FACTORIAL-TAIL-RECURSIVE-OPT</tt> is also tail recursive, but uses the <tt>&amp;OPTIONAL</tt> lambda list keyword to maintain <tt>prod</tt> across iterations. This approach has the downside of exposing <tt>prod</tt> as part of the public interface of the function. Arguably, <tt>prod</tt> is an implementation detail, best kept internal.</li>
</ul>
<br>
<h2>PROG<a id="prog" class="h_anchor"></a></h2>
<pre>
(defun factorial-prog (n)
  (prog ((i 0) (prod 1))
   begin
   (when (eql i n)
     (return prod))
   (setq prod (* prod (incf i)))
   (go begin)))
</pre>
<br>
<ul>
<li>PROG supports both declaring local lexical variables (<tt>i</tt> and <tt>prod</tt>) and naming GO tags (<tt>begin</tt>).</li>
<li><tt>begin</tt> names a label within the <i>implicit <tt>TAGBODY</tt></i> enclosed by <tt>PROG</tt> that may be jumped to.</li>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_when_.htm" title="WHEN" class="http"><tt>WHEN</tt></a> <tt>i</tt> is <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_eql.htm" title="EQL" class="http"><tt>EQL</tt></a> to <tt>n</tt>, <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/s_ret_fr.htm" title="RETURN" class="http"><tt>RETURN</tt></a> returns <tt>prod</tt>.</li>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_go.htm" title="GO" class="http"><tt>GO</tt></a> jumps to <tt>begin</tt>.</li>
</ul>
<br>
<h2>TAGBODY<a id="tagbody" class="h_anchor"></a></h2>
<pre>
(defun factorial-tagbody (n &amp;aux (i 0) (prod 1))
  (tagbody
     begin
     (when (eql i n)
       (return-from factorial-tagbody prod))
     (setq prod (* prod (incf i)))
     (go begin)))
</pre>
<br>
<ul>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_tagbod.htm" title="TAGBODY" class="http"><tt>TAGBODY</tt></a> is the most general but also the lowest-level and most verbose iteration construct.</li>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_dae.htm" title="&amp;aux lambda list keyword" class="http"><tt>&amp;aux</tt> lambda list keyword</a> names local variables <tt>i</tt> and <tt>prod</tt>, initializing them to 0 and 1, respectively.</li>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_when_.htm" title="WHEN" class="http"><tt>WHEN</tt></a> <tt>i</tt> is <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_eql.htm" title="EQL" class="http"><tt>EQL</tt></a> to <tt>n</tt>, <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/s_ret_fr.htm" title="RETURN-FROM" class="http"><tt>RETURN-FROM</tt></a> returns <tt>prod</tt> from the <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/s_block.htm#block" title="BLOCK" class="http"><tt>BLOCK</tt></a> named after the function by <a href="http://www.lispworks.com/documentation/lw60/CLHS/Body/m_defun.htm" title="DEFUN" class="http"><tt>DEFUN</tt></a>.</li>
<li><a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_go.htm" title="GO" class="http"><tt>GO</tt></a> jumps to <tt>begin</tt>.</li>
</ul>

	</div>

	<br />

	<div class='page-footer'>
		<b>Backlinks:</b>

		<a href='../Home.html'>Home</a>

		
		

		<a href='./CommonLisp.html'>Lisp:CommonLisp</a>

		<br /><br />

	</div>

	

</div>

</div id="main">
</body>
</html>