{"componentChunkName":"component---src-templates-blog-post-js","path":"/the-little-schemer-summary-7/","result":{"data":{"site":{"siteMetadata":{"title":"星雨之夜"}},"markdownRemark":{"id":"34028c62-ce9f-5f95-958b-fba11e357fcc","excerpt":"准备知识 set：集合，注意区别于 collection，原子组成的列表，其中不包含重复原子。 pair：其中的两个元素是含义不同但是相关的对象。 构建 pair：。 构建 pair 的表示方式： rel：由 pair 组成的 set。 自定义函数 (set? lat) 定义：判断一个 lat 是不是一个集合（set…","html":"<h2>准备知识</h2>\n<ol>\n<li>set：集合，注意区别于 collection，原子组成的列表，其中不包含重复原子。</li>\n<li>pair：其中的两个元素是含义不同但是相关的对象。</li>\n<li>构建 pair：<code class=\"language-text\">(cons x1 (cons x2 (quote ())))</code>。</li>\n<li>\n<p>构建 pair 的表示方式：</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> first\n <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">p</span><span class=\"token punctuation\">)</span>\n   <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\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> second\n <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">p</span><span class=\"token punctuation\">)</span>\n   <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\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> build\n <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">s1</span> s2<span class=\"token punctuation\">)</span>\n   <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> s1 <span class=\"token punctuation\">(</span><span class=\"token builtin\">cons</span> s2 <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><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>rel：由 pair 组成的 set。</li>\n</ol>\n<h2>自定义函数</h2>\n<h3>(set? lat)</h3>\n<p>定义：判断一个 lat 是不是一个集合（set），集合里不含相同原子。</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> set?\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 boolean\">#t</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">member?</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 builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><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 punctuation\">(</span><span class=\"token function\">set?</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<p>注意 <code class=\"language-text\">member?</code>，第二章就已经实现了这个函数。</p>\n<h3>(makeset lat)</h3>\n<p>定义：把一个 lat 转化为 set（原子去重）。</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> makeset\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><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">member?</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 builtin\">cdr</span> lat<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">makeset</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>\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\">makeset</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\">multirember</code> 函数重写 <code class=\"language-text\">makeset</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> makeset\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><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token keyword\">else</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\">makeset</span>\n            <span class=\"token punctuation\">(</span><span class=\"token function\">multirember</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 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<p>与第一次写出的函数不同的是，这次我们首先移除了剩余列表中的重复原子，最终的打印结果也更加符合直觉。</p>\n<h3>(subset? set1 set2)</h3>\n<p>定义：判断 set1 是不是 set2 的子集。</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> subset?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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 punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">subset?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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 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\">and</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> subset?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">and</span> <span class=\"token punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n             <span class=\"token punctuation\">(</span><span class=\"token function\">subset?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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>(eqset? set1 set2)</h3>\n<p>定义：判断 set1 和 set2 是否相同。</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> eqset?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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\">subset?</span> set1 set2<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">subset?</span> set2 set1<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 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\">and</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> eqset?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token function\">and</span> <span class=\"token punctuation\">(</span><span class=\"token function\">subset?</span> set1 set2<span class=\"token punctuation\">)</span>\n         <span class=\"token punctuation\">(</span><span class=\"token function\">subset?</span> set2 set1<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>(intersect? set1 set2)</h3>\n<p>定义：判断 set1 中是否至少有一个原子也在 set2 中。</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> intersect?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<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 function\">intersect?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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\">or</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> intersect?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">or</span> <span class=\"token punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">(</span><span class=\"token function\">intersect?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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\">subset?</code> 和 <code class=\"language-text\">intersect?</code>。</p>\n<h3>(intersect set1 set2)</h3>\n<p>定义：从 set2 中取出 set1 中包含的原子的列表。</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> intersect\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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 punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<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> set1<span class=\"token punctuation\">)</span>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">intersect</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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\">intersect</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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>(union set1 set2)</h3>\n<p>定义：merge 两个 set。（不知道怎么表述了 😂）</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> union\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">union</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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> set1<span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">union</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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\">((null? set1) (quote ()))</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> xxx\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">set1</span> set2<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> set1<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 punctuation\">(</span><span class=\"token function\">member?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> set1<span class=\"token punctuation\">)</span> set2<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">(</span><span class=\"token function\">xxx</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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> set1<span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">(</span><span class=\"token function\">xxx</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> set1<span class=\"token punctuation\">)</span> set2<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\">xxx</code> 函数返回只存在于 set1 却不存在于 set2 中的原子列表。</p>\n<h3>(intersectall l-set)</h3>\n<p>定义：l-set 是由一组列表组成的非空列表，该函数取出这些列表中的相同原子，返回这些原子组成的新列表。</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> intersectall\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">l-set</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> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> l-set<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> l-set<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\">intersect</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> l-set<span class=\"token punctuation\">)</span>\n                       <span class=\"token punctuation\">(</span><span class=\"token function\">intersectall</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> l-set<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>(a-pair? x)</h3>\n<p>定义：判断 S-表达式 x 是不是一个 pair（仅有两个 S-表达式组成的列表）。</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> a-pair\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">x</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\">atom?</span> x<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 builtin\">null?</span> x<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 builtin\">null?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> x<span class=\"token punctuation\">)</span><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 builtin\">null?</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> x<span class=\"token punctuation\">)</span><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<h2>无知的分割线</h2>\n<p>本章接下来的一部分有点没看懂，不是很明白这里介绍的函数和全函数的概念。所以只写下自己所理解的。</p>\n<h3>(fun? rel)</h3>\n<p>定义：判断一个 rel 中，任一 pair 的第一个元素都与其他 pair 的第一个元素是否相同。或者可以表述为，判断一个 rel 中由每个 pair 的第一个元素组成的新列表是否为一个 set。<strong>我们把这样的 rel 称之为函数</strong>（？）。</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> fun?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">rel</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token function\">set?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">firsts</span> rel<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\">firsts</code> 的定义可以回顾一下第三章。</p>\n<h3>(revrel rel)</h3>\n<p>定义：交换一个 rel 中每个 pair 的两个元素。</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> revrel\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">rel</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> rel<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>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">build</span> <span class=\"token punctuation\">(</span><span class=\"token function\">first</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> rel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                     <span class=\"token punctuation\">(</span><span class=\"token function\">second</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> rel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">revrel</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> rel<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>(revpair pair)</h3>\n<p>定义：交换一个 pair 中的两个元素。</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> revpair\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">pair</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token function\">build</span> <span class=\"token punctuation\">(</span><span class=\"token function\">second</span> pair<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token function\">first</span> pair<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\">revrel</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> revrel\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">rel</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> rel<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>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">revpair</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">car</span> rel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n              <span class=\"token punctuation\">(</span><span class=\"token function\">revrel</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">cdr</span> rel<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>(fullfun? fun)</h3>\n<p>定义：一个 rel 除了是 fun 以外，它的每个 pair 的第二元素也与其他 pair 的第二个元素不同。<strong>我们把这样的 fun 称之为全函数</strong>（？）。它是<strong>一一对应</strong>的。</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> fullfun?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">fun</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token function\">set?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">seconds</span> fun<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\">firsts</code> 那样实现 <code class=\"language-text\">seconds</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> fullfun?\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> <span class=\"token punctuation\">(</span><span class=\"token function\">fun</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">(</span><span class=\"token function\">fun?</span> <span class=\"token punctuation\">(</span><span class=\"token function\">revrel</span> fun<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>","frontmatter":{"title":"The Little Schemer 知识点整理（七）：朋友及关系","date":"2019 年 01 月 05 日","description":"本章介绍了 set（集合）、pair（对）和 rel（关联列表），它们描述了列表之间更深层次的关系。"}}},"pageContext":{"slug":"/the-little-schemer-summary-7/","previous":{"fields":{"slug":"/the-little-schemer-summary-6/"},"frontmatter":{"title":"The Little Schemer 知识点整理（六）：如影随形"}},"next":{"fields":{"slug":"/the-little-schemer-summary-8/"},"frontmatter":{"title":"The Little Schemer 知识点整理（八）：Lambda 终结者"}}}}}