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

<channel>
	<title>潘锦的空间 &#187; Scheme学习</title>
	<atom:link href="https://www.phppan.com/tag/scheme%e5%ad%a6%e4%b9%a0/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Scheme学习笔记一</title>
		<link>https://www.phppan.com/2011/11/scheme-study-01/</link>
		<comments>https://www.phppan.com/2011/11/scheme-study-01/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 01:08:19 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[程序相关]]></category>
		<category><![CDATA[Scheme]]></category>
		<category><![CDATA[Scheme学习]]></category>
		<category><![CDATA[SICP]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1530</guid>
		<description><![CDATA[Scheme学习笔记 本文包括如下内容： 开发环境配置 hello world 变量、过程 标准输入 if语句 [&#8230;]]]></description>
				<content:encoded><![CDATA[<div>
<p>Scheme学习笔记</p>
<p>本文包括如下内容：</p>
<ul>
<li>开发环境配置</li>
<li>hello world</li>
<li>变量、过程</li>
<li>标准输入</li>
<li>if语句</li>
<li>文件写入</li>
</ul>
<h2>环境</h2>
<p>“工欲善其事 必先利其器”。</p>
<p>学习之前我们需要先将Scheme的运行环境搭建起来，环境分Win和Linux，在Win下，直接到 <a href="http://www.gnu.org/software/mit-scheme/">http://www.gnu.org/software/mit-scheme/</a> 下载，安装。</p>
<p>在Ubuntu下，使用apt-get安装（强制建议使用*inux环境），Scheme的解释器有多种选择，这里我们选择mzscheme和guile，二者都可。</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">; mzscheme安装
sudo apt-get install  mzscheme
&nbsp;
;guile 解释器安装
sudo apt-get install guile-1.8</pre></td></tr></table></div>

<h2>Hello World</h2>
<p>创建hello.scm文件，在编辑器(vi/emacs)中输入如下内容：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="scheme" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;hello.scm the first program</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">begin</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;hello world!&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>在命令行下，<strong>guile hello.scm</strong> 或　<strong>mzscheme -r  hello.scm</strong></p>
<p>如果你直接使用guile或mzscheme命令进入其命令行模式。则可以通过(load &#8220;hello.scm&#8221;)加载执行，注意，这里的括号是必须的。</p>
<p>解释下这段代码：</p>
<p>在分号（;）之后一直到行末之间就是注释。如hello.scm的开头部分。标准的Scheme语言定义中没有多行注释，不过在它部分实现中还是存在的。比如在Guile中就有多行注释，以符号组合“#!”开始，以相反的另一符号组合“!#”结束，其中内容为注释。如果加了这样的注释，这个程序就只能用guile来运行，如果使用mzscheme命令来运行则会报错。如果考虑代码的通用性，不建议使用此类注释。</p>
<p>display是输出过程，将内容输出到屏幕， newline的作用是换行显示。</p>
<h2>变量，过程</h2>
<p>在scheme中变量是通过define关键字定义，通过set!改变，并且scheme的变量是固定的类型，这有些类似于现在的python,  php等动态语言，其在运行过程中是可变的，或者说这些动态语言是从函数式编程语言中学习了这些特性。  scheme的过程定义也是通过define关键字来实现的，只是其格式与变量有一些不同。</p>
<p>结合上面的hello world示例，我们看一个示例：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #808080; font-style: italic;">;var.scm</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">; 定义变量x</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> x <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">;定义过程cout</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>cout x<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> x<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">begin</span>
    <span style="color: #66cc66;">&#40;</span>cout x<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">; 改变变量x的值, 这里没有改变类型</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">set!</span> x <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>cout x<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">; 改变变量x的值，这里将之前的整型换成了字符串</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">set!</span> x <span style="color: #ff0000;">&quot;string test&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>cout x<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>定义过程除了上面示例中的方式外，还可以使用lambda来定义过程，其格式如下：</p>
<pre>(define 过程名 ( lambda (参数 ...) (操作过程 ...)))</pre>
<p>而我们的示例中的格式为：</p>
<pre>(define (过程名 参数 ...) (操作过程 ...))</pre>
<p>这两种方式都可以使用，如果你是需要使用匿名函数，使用lambda方案，去掉定义性内容，如下：</p>
<pre> ( lambda (参数 ...) (操作过程 ...))</pre>
<h2>标准输入</h2>
<p>从标准输入读取字符串，这里只用到了read过程，如下示例：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="schem" style="font-family:monospace;">&nbsp;
; 标准输入
    (begin
&nbsp;
    (define str (read))
&nbsp;
    (display str)
    (newline)
    )</pre></td></tr></table></div>

<p>通过定义 str为从标准输入获取内容，即调用 read  获取，以换行或空格结束输入程序通过display过程打印输入的内容，调用newline换行输出。</p>
<h2>if 语句</h2>
<p>和我们常见的if语句结构一样，Scheme语言的if结构有两种格式，</p>
<ul>
<li>一种格式为：(if 测试 过程1 过程2)，对比PHP相当于if else，即测试条件成立则执行过程1，否则执行过程2。</li>
<li>另一种格式为：(if 测试 过程) ，对比PHP，相当于没有else语句的方式，即测试条件成立则执行过程，没有else情况发生。</li>
</ul>
<p>此时，可能会想在PHP中还有elseif语句呢，那么在Scheme中是怎样的？在Scheme中没有else语句也没有相关结构，它是以另一外if语句实现，如果我们在PHP中，则其结构类似于:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;">   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   <span style="color: #666666; font-style: italic;">//  if语句的嵌套，在Scheme只能此种方案，没有简化后的elseif</span>
&nbsp;
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>例如下面代码：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="scheme" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> a <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">read</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> b <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">read</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">; 输出结果，包含从数字到字符串的转化</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>display_rs x<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">string-append</span> <span style="color: #66cc66;">&#40;</span>number<span style="color: #66cc66;">-&gt;</span><span style="color: #b1b100;">string</span> a<span style="color: #66cc66;">&#41;</span> x <span style="color: #66cc66;">&#40;</span>number<span style="color: #66cc66;">-&gt;</span><span style="color: #b1b100;">string</span> b<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> a b<span style="color: #66cc66;">&#41;</span> 
    <span style="color: #66cc66;">&#40;</span>display_rs <span style="color: #ff0000;">&quot;&lt;&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> a b<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>display_rs <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>display_rs <span style="color: #ff0000;">&quot;&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>示例程序从标准输入接收两个数字，a和b。对比两个数字，显示最终谁大谁小。  其中，string-append是字符串连接过程，number-&gt;string的作用是数字转化为字符串。  display_rs是一个自定义的过程，显示比较的结果用，其传入的值为比较后的结果。</p>
<h2>文件写入：</h2>

<div class="wp_syntax"><table><tr><td class="code"><pre class="scheme" style="font-family:monospace;">&nbsp;
<span style="color: #808080; font-style: italic;">;file.scm 文件操作</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">; 文件写入操作</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> port <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">open-output-file</span> <span style="color: #ff0000;">&quot;temp&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">output-port</span>? port<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">begin</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">write</span> <span style="color: #ff0000;">&quot;helloworld&quot;</span> port<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">close-output-port</span> port<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;yes&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">begin</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;write file temp failed.&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>在<a href="http://www.ibm.com/developerworks/cn/linux/l-scheme/part2/">《Scheme  程序语言介绍之一》</a>这篇文章的开头处有一段话，虽有些玩笑之言，却值得沉思：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">在网上有这样一句有趣的评论：计算机科学的大部分，就是在重复发现很久以前别人就早已 发现过的东西。
当然，这是一句玩笑。不过我们可以给这句玩笑接个下巴：对于程序语言中 的每一个重要概念，
你都可以先在 Lisp 当中发明一次，再在 C++ 里面发明一次，再在 Java 里面发明一次，
再在 Python 里面发明一次，再在 Perl 里面发明一次，再在 Ruby 里面发明一次，
当然，最后还要在 C# 里面再发明一次。</pre></td></tr></table></div>

<p>在学习的过程中，参考了如下书籍和链接：</p>
<ul>
<li>《The Scheme Programming Language》</li>
<li>《Structure and Interpretation of Computer Programs,Second Edition》</li>
<li>http://zh.wikipedia.org/zh/Scheme</li>
<li>http://www.ibm.com/developerworks/cn/linux/l-scheme/part2/</li>
<li>http://www.ibm.com/developerworks/cn/linux/l-schm/index1.html</li>
<li>http://www.ibm.com/developerworks/cn/linux/l-schm/index2.html</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/11/scheme-study-01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
