MIT/GNU Scheme用户手册(六)

3 使用Scheme
本章描述如何使用Scheme求取表达式的值以及如何加载Scheme程序。还描述了如何保存自定义的"world image",和如何控制垃圾回收器。再接下来的章节会描述如何使用编译器和如何调试程序。
3.1 读算打印环(Read-Eval-Print Loop, REPL)
当你第一次从命令行启动Scheme时,你将会在一个叫做REPL的程序中进行输入。当它在等待输入时,会在屏幕左上角显示一个输入提示。然后你就可以键入一个表达式(以RET结尾)。Scheme会对输入的表达式求值,打印其结果,然后给出另一个输入提示。
3.1.1 输入提示和层级号(Level Number)
REPL输入提示一般具有如下的形式:
    1 ]=>
其中“1”表示层级号,为一个正整数。这个整数在特定条件下会递增,最常见的情况就是出现了错误时递增。例如,若你键入“f o o RET”:
                ;Unbound variable: foo
                ;To continue, call RESTART with an option number:
                ; (RESTART 3) => Specify a value to use instead of foo.
                ; (RESTART 2) => Define foo to a given value.
                ; (RESTART 1) => Return to read-eval-print level 1.
                
                2 error>
在这个情况下,层级号增加为“2”,表示一个新的REPL的启动(提示字符串被改写为error表示此REPL是因为一个错误引发的)。其中“2”表示新的REPL,原来的REPL还存在,并等待返回到它,如键入“(restart 1)”。此外,若“2”中有新的错误发生,则层级号会变为“3”,直至无限,但通常使用中不会超过几个层级。
通常从一个错误的REPL回到最顶层级的方法是使用C-g中断,即:Ctrl+g。C-g会终止当前运行并立即回到最顶层级REPL。
注:“error>”的出现不表示Scheme在一个你需要避免的不一致的状态下。它仅仅是提醒你程序出现了错误:你键入了一个非法操作,但被系统截获且避免掉了。通常,查明错误的最好的方法是在出现错误的REPL中捣鼓一阵子。若你退出了出错的REPL,那么错误的上下文环境就被破坏了,你也就不知道到底发生了什么。
3.1.2 中断(Interrupting)
Scheme有几个中断按键,在不同操作系统下有所不同:unix中为C-g和C-c;Windows下为C-g,C-b,C-x和C-u。C-g终止任何的执行中的Scheme求值并返回到最顶层的REPL。C-c则给出选择提示,根据你的输入字符来进行操作。C-g或C-c后不需要键入回车键(RET),C-c的提示输入也不需要回车键确认。
下面是常见中断键的定义;在unix中,键入C-c ?可以查询更多的可能性。注意在任何给定的实现中,只有下面的一个子集可用。
C-c C-c
C-g                退出Scheme求值并返回顶层的REPL。若当前没有求值运行,则相当于对如下表达式求值
                                (cmdl-interrupt/abort-top-level)
C-c C-x
C-x                退出Scheme求值并返回到“当前的”REPL。若当前没有求值运行,则相当于
                                (cmdl-interrupt/abort-nearest)
C-c C-u
C-u                退出求值并向上一层。若已经是层级1,则终止求值并留在层级1.若没有求值,则相当于
                                (cmdl-inerrupt/abort-previous)
C-c C-b
C-b                挂起当前的求值并启动一个REPL断点。求值可以任何时候通过语句(continue)继续进行。
C-c q              与键入“(exit)”类似,只是它不需要进行确认,也不管是否当前有求值在运行。
C-c z              与键入“(quit)”类似,在Scheme求值过程中也起作用。
C-c i               忽略中断。若你错误的键入了C-c,使用 i取消。
C-c ?              输出帮助信息。任何在此处没有给出的选项都可以使用此命令找到。
3.1.3 重启REPL(restarting)
另外一种退出REPL的方式是使用restart过程:
restart [k]
                选择并触发一个restart方法。对于每个REPL和每个错误,restart方法列表都是不同的;在一个错误REPL情况下,错误REPL启动时有如下输出:
                ;Unbound variable: foo
                ;To continue, call RESTART with an option number:
                ; (RESTART 3) => Specify a value to use instead of foo.
                ; (RESTART 2) => Define foo to a given value.
                ; (RESTART 1) => Return to read-eval-print level 1.

                2 error>
若给出了k,则k必须是一个输出列表中的正整数(如上实例必须为1~3)。k的选择即激活编号为k的REPL。若k没有给出,则输出会让你选择一个k:
                2 error> (restart)
                ;Choose an option by number:
                ; 3: Specify a value to use instead of foo.
                ; 2: Define foo to a given value.
                ; 1: Return to read-eval-print level 1.

                Option number:
最简单的restart方法如下:
                2 error> (restart 1)
                ;Abort!

                1 ]=>
其他的方法则会提示需要再次输入才能继续:
                2 error> (restart)
                ;Choose an option by number:
                ; 3: Specify a value to use instead of foo.
                ; 2: Define foo to a given value.
                ; 1: Return to read-eval-print level 1.

                Option number: 3
               
                Value to use instead of foo: ’(a b)
                ;Value: (a b)

                1 ]=>
3.1.4 当前的REPL环境
每个REPL都有一个当前的环境,是表达式求值和定义存储的地方。当Scheme启动时,这个环境就是变量user-initial-environment的值。系统中还有多个其他环境,比如system-global-environment,是运行系统的绑定存储的位置。
你可以通过如下的表达式得到当前的REPL环境
                (nearest-repl/environment)
还有一些其他方法可以得到各个环境。例如,若你有一个过程对象,通过如下的过程调用,你可以得到指向环境的指针:
                (procedure-environment  procedure)
改变REPL环境的过程是:
ge  environment                                                                [procedure]
修改当前的REPL环境为 environment(ge表示"Goto Environment")。其中的environment既可以是一个过程,也可以是一个环境对象。若它是一个过程,则转到过程的结尾环境。
pe                                                                                        [procedure]
用来找到你所在的环境(pe表示“Print Environment”)。若当前的REPL环境属于一个包(package),则pe返回包的名字(一个符号列表)。若当前的REPL环境不属于包,则返回其环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值