SICP - 安装环境
MIT Scheme
安装
sudo apt-get install xutils-dev m4
http://www-users.cselabs.umn.edu/classes/Fall-2010/csci1901/mit-scheme-x64_9.0.1-1_amd64.deb
试试能不能运行:
mit-scheme
可以看到欢迎信息,通过以下命令再显示一次:
(identify-world)
载入已经存在的文件:
(load "6-sqrt-iter.scm")
基本使用
在交互式执行方式下,系统(启动后)将在一个窗口显示版本信息,最后是提示符:
1 ]=>
键入的程序代码将显示在提示符之后。
此时系统执行read-evaluation-print
循环(读入-求值-打印循环,REPL),
可以键入符合 Scheme 语法要求的表达式(程序),要求系统对其求值。
表达式中可以任意换行。一旦系统读到一个完整的表达式,就会对它求值(计算),
并打印出求得的值。
Scheme 不区分标识符中的大写和小写,define
和DEFINE
,Define
同样对待。
启动后的提示符1 ]=>
中的数字1
表示当前系统运行在第一层「读入-求值-打印循环」。
如果求值中出错,系统将进入更高层次的「读入-求值-打印循环」,也是系统的出错处理循环。
在出错循环中仍然可以像在第一层循环一样使用 Scheme 系统,还可以做一些其他事情(参看 Scheme 文档)
退出一层或多层「读入-求值-打印循环」:
可以用Ctrl-u
组合键退出一层求值循环,用Ctrl-g
退到第一层循环。
中断执行:
-
组合键
Ctrl-g
:杀掉正在进行的求值并回到第一层 REPL -
组合键
Ctrl-x
:杀掉正在进行的求值并回到当前 REPL -
组合键
Ctrl-u
:杀掉正在进行的求值并回到上一层 REPL -
组合键
Ctrl-b
:暂停当前求值进入断点 REPL。可以用(continue)
唤醒中断的执行
Scheme 文件操作
编辑和装入程序文件:
如果程序比较长,可以用系统外的编辑器编写好程序源文件,而后用load
函数装入系统。下面是一个用绝对路径的实例:
1 ]=> (load "e:\\temp\\test1.scm")
求值这个表达式,可以看到文件装入的信息。load
函数还可以装入编译好的程序文件,详情见 Scheme 文档 「MIT Scheme User's Manual」 的 「3.2 Loading Files」。
用函数cd
可以转换当前工作目录。下面是一个实例:
1 ]=> (cd "e:\\temp")
此后就可以直接用文件名装入这个目录下的文件了。
保存和恢复系统映像
可以将 Scheme 系统的当前运行现场保存起来,以便将来回复这个现场。
这样保存的现场称为一个「world image」或者一个「band」。实际上,
Scheme 启动时也就是装入了一个默认的band
,装入编译器的启动方式就是装入另一个band
。
函数save-disk
将当前现场存入文件。下例将现场存入当前目录下的文件image1
:
1 ]=> (disk-save "image1")
函数disk-restore
恢复原保存在一个文件里的现场:
1 ]=> (disk-restore "image1")
阅读 MIT Scheme 文档
- 「MIT Scheme Reference」 介绍 MIT Scheme 的详细功能,
- 「MIT Scheme User's Manual」 介绍 MIT Scheme 的使用。
- 「SOS Reference Manual」 介绍的 SOS 是 Scheme 的一个对象系统,
- 「IMAIL User's Manual」 介绍的 IMAIL 是用 Scheme 做的一个邮件阅读器。 下面简单介绍与前两个文档有关的若干问题。
MIT Scheme 手册的主要内容是介绍这个 Scheme 系统提供的功能, 包括预定义的变量(variable)、特殊形式(special form)和过程(procedure,函数) 。例如
过程的实例
procedure: eqv? obj1 obj2
过程名是eqv?
,取两个参数。使用的例子:
(eqv? 3 2)
另一个例子:
procedure: list object ...
过程名是list
,取0
个或任意多个参数。用例:
(list 1 2 3 4)
特殊形式的实例
special form: lambda formals expression expression ...
特殊形式,名字是lambda
,后面应有一个参数表和一个或多个表达式。用例:
(lambda (x y) (+ x y))
Edwin
安装和启动
在 Windows 下正确安装 MIT Scheme 系统后,程序菜单里将有一个MIT Scheme
目录,其中包含:
- Documentation:以浏览器方式打开 HTML 形式的 Scheme 文档文档
- MIT GNU Scheme:Edwin 环境下启动 Scheme。Edwin 是一个类似 emacs 的编辑器
如果喜欢用命令行交互方式,可以用下述命令建一个快捷命令, 放在你的桌面或者命令菜单里。注意将目录修改为你的系统安装目录:
"C:\Program Files\MIT-GNU Scheme\bin\scheme.exe" --library "C:\Program Files\MIT-GNU Scheme\lib"
概述
Edwin 是 MIT Scheme 系统的一个窗口式的编辑使用前端。其功能和使用方式都像著名编辑器 EMACS,使用方面的进一步细节可以参考 EMACS。本页简单介绍 Edwin 的使用。
启动 Edwin 实际上是先启动 Scheme 系统再启动一个 Edwin 前端。Edwin 是一个用 Scheme 写的交互式编辑器。其特点是支持 Scheme 表达式的编辑和求值。
介绍 Edwin 的文档里常提到 buffer,这个概念类似于一般多窗口编辑器的编辑区。
两种不同执行模式
在 Edwin 执行时,一个编辑区(称为一个 buffer)可能处于两种不同的运行模式:
Edwin 模式:
也就是编辑 Scheme 文件的模式。如果装入一个.scm
文件,相应的 Edwin 的这个编辑区处于 Edwin 模式。
在这种模式下可以编写 Scheme 程序,也可以对表达式求值。正常求出的值显示在最下面交互行,但不会显示出错信息,也不能进入调试系统
特殊的 REPL 模式:
这时可以看到窗口下面状态条中显示(REPL: lesten)
。这时系统处于正常的 Scheme 交互模式,
所有输出都显示在编辑器的窗口里,只不过是在 Edwin 里执行。
在这种情况下可以看到所有系统输出(包括出错信息),也可以进入 debuger
(是一个用 Scheme 写的交互式程序,它启动后打开另一个窗口)。
任何时候都可以用M-x repl
回到或打开一个 REPL buffer。
启动 Edwin 后编辑器处于支持输入和求值 REPL 的模式。窗口下方黑条显示:
--**-Ediwin: *Scheme* (REPL: Listen) ----All----
表示 Edwin 的模式,这时 Scheme 正在 REPL (Read-Evaluation-Print-Loop,读入-求值-打印循环) 中等待输入。上部大区域是交互窗口,可以在这里输入表达式并要求求值。
建议大家在编辑模式下编写程序(函数的定义,所需基本数据的定义等),检查无误后(例如,函数能正常定义了)保存,然后在 REPL 模式里装入
(用 Scheme 语言的load
,见使用简介)并做各种试验和调试(输入并求值各种具体计算表达式)。
记号
C-x
,C-c
等表示按住Ctrl
键的同时按x
或c
键;
M-p
等表示在按住Meta
键的同时按p
键。在 PC 键盘上没有Meta
键,可以直接用Alt
键加上p
键,或者先按Esc
键再按p
键。
帮助信息
在 Edwin 里按Ctrl-h t
,它会装入一个 tutorial 文件,其中讲述了各种常用命令。在 Windows 的 Scheme 程序菜单里的 Documentation 包含大量与 Scheme 有关的信息。
网上可以找到许多相关信息。下面是一些有用链接:
- http://www.cnblogs.com/Henrya2/archive/2009/02/21/1395615.html
- http://blog.csdn.net/msnlogo/archive/2009/04/05/4050176.aspx
- http://www.blogjava.net/zhenyu/archive/2006/10/17/75657.html
- http://harry.javaeye.com/blog/446418
从交互循环进入 Edwin
在交互方式下执行(edit)
或(edwin)
,将启动或返回 Edwin
Edwin系统的退出
-
C-x z
:从 Edwin 中退到 Scheme 的命令交互状态。此时 Edwin 挂起,可用(edit)
唤醒挂起的 Edwin,回到挂起前的状态。 -
C-x c
:停止 Edwin 并回到 Scheme 的命令交互状态。 -
C-x C-z
:停止 Edwin 并挂起 Scheme 系统。再次启动 Scheme 将唤醒挂起的 Scheme 系统,回到挂起前的系统状态。 -
C-x C-c
:停止 Edwin 和 Scheme 系统。 -
(exit)
:退出 Scheme 系统。
求值
命令行交互方式下回车,如果已输入了一个完整表达式,系统就会对其求值并输出结果
在 Edwin 里C-x C-e
求值光标左边的一个完整表达式,M-z
求值光标当时位于其中的整个定义式(一个定义式也就是一个表达式,其左括号从最左边开始)
简单编辑和执行
-
光标移动可以通过普通移光标键,或通过鼠标点击。用
Delete
或Backspace
键删除字符。 -
在正常输入过程中,每次输入右括号
(
,环境将自动闪烁对应的左括号)
。 -
对于多行输入的表达式,换行后按
C-i
,系统能将光标自动对齐到合适位置。对于各种复杂的 Scheme 表达式,例如let
,cond
, 等等,Edwin 都定义了很好的对齐方式。 -
求值表达式的方式:将编辑光标(反色小块)移到表达式后面,按键
C-x C-e
。 - 被求值的表达式将由另一个线程求值,在求值过程中我们仍然可以做编辑工作。
-
C-c C-x
或C-c C-u
,用于杀掉正在进行的求值。 -
C-c C-b
中断当前求值,进入断点状态。
翻页等命令:
-
C-v
:向下翻一屏 -
M-v
:向上翻一屏 -
C-a
:移动到行首 -
C-e
:移动到行尾
在 REPL 模式下,所有输入的历史都有记录。这使我们可以很方便地再次使用曾经输入过的表达式。
M-p
反向枚举曾经输入的表达式,M-n
正向枚举这些表达式。
这里列出了 Edwin 的常用命令(英文) 这里列出了 EMACS 的一些常用命令(中文,在Edwin里都可用)
调试
如果正在进行的求值出错,系统将给出一些错误信息,并询问是否启动调试器(debuger)。
回答y
要求系统启动调试器,显示出一个新的调试器窗口;回答n
回到原求值循环。
一个操作的例子:
在桌面上或者开始菜单找到MIT-GNU Scheme的快捷方式,如图:
现在得到的界面是:
请注意,左上角的窗口名,Edwin: *scheme*
。并且,在状态栏,你可以看到重叠的小图标,
证明刚刚我们其实打开了两个窗口,如图:
请注意,这两个窗口左上角的窗口名字是不一样的:
现在,切换到图2的窗口,然后按下Ctrl x
按键,然后松开,然后按下z
键。
然后切换到另外一个窗口!
如果你看到的界面和下图一样,证明你成功了。重点我标记出来了。
我用给你看:
DrRacket
如果是用common lisp语言的开发工具还有DrRacket。 DrRacket还专门提供了对SICP模拟的支持,在程序开头用:
#lang planet neil/sicp
不要打开一个已经存在的项目,将本来是#lang rackt
的改为#lang planet neil/sicp
。
必须要是新建的文件。不然会卡死程序。
然后点击run。接着DrRacket就会自动下载,所需的东西并搞好。等到它finish了以后,
关闭进来,新建项目,再将#lang rackt
改为#lang planet neil/sicp
以后,点击run就可以了。
http://www.neilvandyke.org/racket-sicp/
http://stackoverflow.com/questions/3345397/how-is-racket-different-from-scheme