大家吼,我是蘑菇老师,今天我们来学习怎么用装好的MIT-Scheme。
认识界面
双击桌面的快捷方式,我们就看到了这样的一个窗口,看标题栏,这是一个叫做Edwin的程序。
咦,再仔细看,任务栏里面有两个窗口,另一个是这样的:
这个窗口叫交互窗口。但是现在只有Edwin窗口在激活的状态,而交互窗口不在工作中。等以后我们再用这个模式,现在还是先把注意力集中于Edwin窗口。
使用Edwin
Edwin是专用于编写Scheme的编辑器,功能与Emacs非常接近。如我之前的日志提到的,Emacs提供了非常适合编写Lisp的环境,Edwin也为编写Scheme提供了很多便捷的功能。
在Edwin里面,我们可以编辑字符,也就是程序代码。但是要想进行复制、粘贴等操作,或者是让代码运行起来,就需要使用快捷键了。这里列出几个基本的快捷键,关于更详细的信息,可以参阅
Edwin Cheat Sheet
注:C-x 是Ctrl+x的简写,而M-x就是Alt+x的简写,以此类推
区域操作
在Edwin里,不像windows可以选中一段文字来操作,所以需要一个叫做“标记”的东西。放置了标记之后,把光标移动到另一个位置,就可以通过快捷键来操作光标到标记之间的内容。为方便起见,这里将以标记为起点,光标为终点的这一部分区域称为“标记区域”。
先介绍几个快捷键
C-k 删除本行里,光标后面的部分
C-space 放置标记
C-w 删除标记区域,内容进入剪贴板
M-w 拷贝标记区域,内容进入剪贴板
C-y 粘贴剪贴板的内容
C-a 跳到一行的开头
c-e 跳到一行的结尾
从这里可以看到,删除特定的区域可以用C-w完成。复制,用到了M-w和C-y。而剪贴可以通过C-w和C-y的组合实现。
跟Scheme有关的快捷键
跟Scheme有关的命令
C-x C-e 按顺序按这两个组合键,执行光标左边的一个表达式
M-z 执行当前光标所在的表达式
C-M-z 执行标记区域内的表达式
C-c C-c 停止执行
Tab 自动缩进
就先介绍这几个吧。你可能会问了,为什么所有的功能都要靠按键来完成?其实,这些编辑器以前是纯文字界面中运行的,那时候没有鼠标,也没有窗口和按钮,想要实现什么功能,快捷键是最方便和最迅速的方式。
对入门者来说(我也是个入门者),最头疼的就是这么多命令,该怎么记?我的建议就是,不要记。把Cheat Sheet准备好,编程的时候就放在屏幕的另一边,要什么功能就看一眼。其实一来二去的,常用的功能就记下来了。
Scheme表达式
嗯,差不多了,这就开始吧。从最基本的数学运算开始,走起:
(+ 1 2) //然后按 M-z 或者C-x C-e
Value: 3 //结果就会出现在这里
结果会直接出现在文档里,这里就是一个神奇的游乐场,代码写在这里,结果也打印在这里。想要运行哪一个表达式,就把光标移过去,按 M-z 或者 C-x C-e,结果就会被打印出来了。
如果输入了错误的表达式,可能会触发这样的提示:
这里的意思是出了错误,并且提供了几种处理方式,我建议直接终止当前的命令,返回原来的模式。按n,不启动debugger,然后输入(RESTART 1),这同样是一个表达式,按M-z执行,这样就跳出了异常处理的模式。
语法说明
//Scheme的表达式
(<operator> <operands...>)
对于Scheme,表达式由一对括号、以及里面的操作符(operator)和操作数(operand)构成。其中操作符出现在最左边,操作数依次出现,与操作符要用空格隔开。操作数的数目是由操作符决定的。在Scheme里面,四则运算的操作符,可以是2个,也可以是多个,例如:
(+ 1 2 3 4 5)
(- 10 1 2 3)
(* 3 3 3)
(/ 8 2 2)
这些都是合法的表达式,可以得到正确的结果。你可能会觉得奇怪,为什么要用这么一种违背直觉的写法,这种写法的一个好处就是可以很紧凑地书写表达式,不必重复操作符。
(RESTART 1)
这也是一个表达式,RESTART就是一个操作符,1是它的操作数。它的功能就是中止当前的所有任务,回到编辑模式。
不要忘记,在这个文档编辑的环境里,执行过的代码可以被修改和再次执行,只需要把光标移过去,修改之后再按相应的组合键就可以了。
表达式的复合
(+ (+ 1 2)
(- 5 3))
(/ (+ 4 6)
(- 5 3))
表达式的复合是很自然的事情,SICP书中详细地讨论了Scheme内部是怎样完成复合运算的,但是我觉得还是不要涉及那么多细节了吧。简单说来,它先计算内部表达式的值,然后用它代替这个表达式,于是复杂的表达式就变成了简单表达式。
(+ (+ 1 2)
(- 5 3))
变成了
(+ 3
2)
得到
5
对于符合表达式的写法的建议:
虽然Scheme不关心你是怎样排版你的程序,但是出于可读性的考虑,最好把同一层级的元素放在相同的缩进位置。
(operator1 operand1
operand2
(operator2 operand2_1
operand2_2)
operand3)
依此类推。对于缩进,可以在按Enter换了一行之后,按Tab,Edwin有智能缩进的功能, 最后不要忘记括号要成对,不然可没办法写出正确的表达式哦。
小结
于是到这里,我们就学完了Scheme的最基本的组成单元。
留个作业吧
- 用Scheme写几个表达式,简单的或者复合的,求值。
- 尝试用文中给出的几个组合键进行删除,复制,剪切,粘贴等操作,熟悉Edwin的工作方式。
下节会讲如何自己定义简单的操作符,敬请期待啦。