{"componentChunkName":"component---src-templates-blog-post-js","path":"/the-little-schemer-summary-4/","result":{"data":{"site":{"siteMetadata":{"title":"星雨之夜"}},"markdownRemark":{"id":"4f702cab-774b-530b-a743-ed83cc39d198","excerpt":"准备知识 所有数字都是原子； 暂时只考虑非负整数，0、1、2、3……； 用  判断数字  是否为零； tup 是元组 Tuple 的缩写，用来表示一个数字列表， 也是一个 tup…","html":"<h2>准备知识</h2>\n<ol>\n<li>所有数字都是原子；</li>\n<li>暂时只考虑非负整数，0、1、2、3……；</li>\n<li>用 <code class=\"language-text\">(zero? n)</code> 判断数字 <code class=\"language-text\">n</code> 是否为零；</li>\n<li>tup 是元组 Tuple 的缩写，用来表示一个数字列表，<code class=\"language-text\">()</code> 也是一个 tup；</li>\n<li><code class=\"language-text\">(and a b)</code> : 类似于 <code class=\"language-text\">(or a b)</code>，<code class=\"language-text\">&amp;&amp;</code> 和 <code class=\"language-text\">||</code> 的区别(?)；</li>\n<li><code class=\"language-text\">=</code> 用来测试数字类型的原子，<code class=\"language-text\">eq?</code> 用来测试其他类型的原子；</li>\n<li><code class=\"language-text\">number?</code> 是一个基本函数，判断参数是否为数值型原子；</li>\n<li>空心加号（区别于数学符号+）打不出来，所以原书中的空心加号用 <code class=\"language-text\">plus</code> 代替；</li>\n</ol>\n<h3>重要</h3>\n<p>以下定义可以说明我们的操作并不违反 Scheme 十诫。详见起飞式。</p>\n<ol>\n<li><code class=\"language-text\">zero?</code> 之于数字相当于 <code class=\"language-text\">null?</code> 之于列表；</li>\n<li><code class=\"language-text\">add1</code> 之于数字，相当于 <code class=\"language-text\">cons</code> 之于列表。</li>\n</ol>\n<h2>Scheme 十诫之第一诫（起飞式）</h2>\n<ul>\n<li>当对一个原子列表 <code class=\"language-text\">lat</code> 进行递归调用时，询问两个有关 <code class=\"language-text\">lat</code> 的问题：<code class=\"language-text\">(null? lat)</code> 和 <code class=\"language-text\">else</code>。</li>\n<li>当对一个数字 <code class=\"language-text\">n</code> 进行递归调用时，询问两个有关 <code class=\"language-text\">n</code> 的问题：<code class=\"language-text\">(zero? n)</code> 和 <code class=\"language-text\">else</code>。</li>\n</ul>\n<h2>Scheme 十诫之第四诫（起飞式）</h2>\n<p>在递归时总是改变至少一个参数。该参数必须向着不断接近结束条件而改变。改变的参数必须在结束条件中得以测试：当使用 <code class=\"language-text\">cdr</code> 时，用 <code class=\"language-text\">null?</code> 测试是否结束；当使用 <code class=\"language-text\">sub1</code> 时，用 <code class=\"language-text\">zero?</code> 测试是否结束。</p>\n<h2>Scheme 十诫之第五诫</h2>\n<ul>\n<li>当用 <code class=\"language-text\">plus</code> 构建一个值时，总是使用 0 作为结束代码行的值，因为加上 0 不会改变加法的值。</li>\n<li>当用 <code class=\"language-text\">×</code> 构建一个值时，总是使用 1 作为结束代码行的值，因为乘以 1 不会改变乘法的值。</li>\n<li>当用 <code class=\"language-text\">cons</code> 构建一个值时，总是考虑把 <code class=\"language-text\">()</code> 作为结束代码行的值。</li>\n</ul>\n<h2>自定义函数</h2>\n<h3>(add1 n)</h3>\n<p>定义：<code class=\"language-text\">n</code> 加一。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> add1\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token operator\">+</span> n <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(sub1 n)</h3>\n<p>定义：<code class=\"language-text\">n</code> 减一。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> sub1\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token operator\">-</span> n <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(plus n m)</h3>\n<p><em>打不出空心加号，用 plus 代替</em></p>\n<p>定义：把 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 相加。用到了上面定义的 <code class=\"language-text\">add1</code> 和 <code class=\"language-text\">sub1</code>，以下函数的用法相似。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> plus\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> n<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">add1</span> <span class=\"token punctuation\">(</span><span class=\"token function\">plus</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(minus n m)</h3>\n<p><em>打不出空心减号，用 minus 代替</em></p>\n<p>定义：把 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 相减。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> minus\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> n<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> <span class=\"token punctuation\">(</span><span class=\"token function\">minus</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(addtup tup)</h3>\n<p>定义：通过统计参数 <code class=\"language-text\">tup</code> 中所有数字之和来构建一个新的数字。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> addtup\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">tup</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> tup<span class=\"token punctuation\">)</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">plus</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> tup<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">addup</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> tup<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(× n m)</h3>\n<p>定义：把 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 相乘。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> ×\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">plus</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">×</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(tup+ tup1 tup2)</h3>\n<p>定义：对于相同长度的 <code class=\"language-text\">tup1</code> 和 <code class=\"language-text\">tup2</code>，其将 <code class=\"language-text\">tup1</code> 的第一个数字加到 <code class=\"language-text\">tup2</code> 的第一个数字上，然后将<code class=\"language-text\">tup1</code> 的第二个数字加到 <code class=\"language-text\">tup2</code> 的第二个数字上，以此类推，构建出结果一个新的 tup。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> tup+\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">tup1</span> tup2<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">and</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> tup1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> tup2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">quote</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token function\">plus</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> tup1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> tup2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">tup+</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> tup1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> tup2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>还可以改造成对任意两个 tup 的 <code class=\"language-text\">tup+</code>：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> tup+\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">tup1</span> tup2<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> tup1<span class=\"token punctuation\">)</span> tup2<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> tup2<span class=\"token punctuation\">)</span> tup1<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token function\">plus</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> tup1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> tup2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">tup+</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> tup1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> tup2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(> n m)</h3>\n<p>定义：比较 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 的大小，如果前者大于后者，则返回 <code class=\"language-text\">#t</code>，否则返回 <code class=\"language-text\">#f</code>。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> >\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> n<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#t</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">></span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>注意</strong>两个条件的顺序，下同。</p>\n<h3>(&#x3C; n m)</h3>\n<p>定义：比较 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 的大小，如果前者小于后者，则返回 <code class=\"language-text\">#t</code>，否则返回 <code class=\"language-text\">#f</code>。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> &lt;\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> n<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#t</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(= n m)</h3>\n<p>定义：比较 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 的大小，如果两者相等，则返回 <code class=\"language-text\">#t</code>，否则返回 <code class=\"language-text\">#f</code>。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> =\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> n<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#t</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>或者：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> =\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">></span> n m<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span> n m<span class=\"token punctuation\">)</span> <span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token boolean\">#t</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(↑ n m)</h3>\n<p>定义：计算 <code class=\"language-text\">n</code> 的 <code class=\"language-text\">m</code> 次方。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> ↑\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> m<span class=\"token punctuation\">)</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">×</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">↑</span> n <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(÷ n m)</h3>\n<p>定义：把 <code class=\"language-text\">n</code> 与 <code class=\"language-text\">m</code> 相除，只求商。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> ÷\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> m<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&lt;</span> n m<span class=\"token punctuation\">)</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">add1</span> <span class=\"token punctuation\">(</span><span class=\"token function\">÷</span> <span class=\"token punctuation\">(</span><span class=\"token function\">minus</span> n m<span class=\"token punctuation\">)</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(length lat)</h3>\n<p>定义：求列表 <code class=\"language-text\">lat</code> 包含的元素个数。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> length\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">lat</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> lat<span class=\"token punctuation\">)</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">add1</span> <span class=\"token punctuation\">(</span><span class=\"token function\">length</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(pick n lat)</h3>\n<p>定义：获取列表 <code class=\"language-text\">lat</code> 中的第 <code class=\"language-text\">n</code> 个元素。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> pick\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> lat<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">pick</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(rempick n lat)</h3>\n<p>定义：剔除列表 <code class=\"language-text\">lat</code> 中的第 <code class=\"language-text\">n</code> 个元素，以此构建一个新列表。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> rempick\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> lat<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">rempick</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>或者（使用下述函数 <code class=\"language-text\">one?</code>）：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> rempick\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span> lat<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">one?</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">rempick</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(no-nums lat)</h3>\n<p>定义：返回一个列表，该列表移除了原始 <code class=\"language-text\">lat</code> 中的所有数字原子。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> no-nums\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">lat</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> lat<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">quote</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">no-nums</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">no-nums</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(all-nums lat)</h3>\n<p>定义：返回一个列表，该列表找出原始 <code class=\"language-text\">lat</code> 中的所有数字原子，并组成一个新的 tup。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> all-nums\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">lat</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> lat<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">quote</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">all-nums</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">all-nums</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(eqan? a1 a2)</h3>\n<p>定义：如果参数 <code class=\"language-text\">a1</code> 和 <code class=\"language-text\">a2</code> 是同一个原子则返回 true（<code class=\"language-text\">#t</code>）。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> eqan?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">a1</span> a2<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">and</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> a1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> a2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token operator\">=</span> a1 a2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">or</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> a1<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">number?</span> a2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">eq?</span> a1 a2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(occur a lat)</h3>\n<p>定义：统计原子 <code class=\"language-text\">a</code> 在列表 <code class=\"language-text\">lat</code> 中出现的次数。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> occur\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">a</span> lat<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">null?</span> lat<span class=\"token punctuation\">)</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">eq?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> lat<span class=\"token punctuation\">)</span> a<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">add1</span> <span class=\"token punctuation\">(</span><span class=\"token function\">occur</span> a <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span><span class=\"token function\">occur</span> a <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>(one? n)</h3>\n<p>定义：如果 <code class=\"language-text\">n</code> 为 1，则返回 <code class=\"language-text\">#t</code>，否则返回 <code class=\"language-text\">#f</code>。</p>\n<p>实现：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> one?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token keyword\">cond</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">zero?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">sub1</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token boolean\">#t</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</span> <span class=\"token boolean\">#f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>★ 或者简化并移除 <code class=\"language-text\">(cond ...)</code>：</p>\n<div class=\"gatsby-highlight\" data-language=\"scheme\"><pre class=\"language-scheme\"><code class=\"language-scheme\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">define</span> one?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">n</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token operator\">=</span> n <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"The Little Schemer 知识点整理（四）：数字游戏","date":"2018 年 12 月 06 日","description":"顾名思义，本章内容在跟数字打交道。介绍了 zero? / number? 等基本函数，然后引入了 add1 和 sub1 这两个在本章大显身手的函数，而后按部就班地教我们定义了数学运算中的加减乘除及其他方法。"}}},"pageContext":{"slug":"/the-little-schemer-summary-4/","previous":{"fields":{"slug":"/the-little-schemer-summary-3/"},"frontmatter":{"title":"The Little Schemer 知识点整理（三）：用 cons 构筑恢宏"}},"next":{"fields":{"slug":"/how-to-contribute-to-open-source-project/"},"frontmatter":{"title":"如何向开源项目贡献代码"}}}}}