scheme基础
scheme
是lisp
的一种方言,lisp
是 LISt Process 的缩写。本文介绍scheme
的基础语法便于后续研究。
表达式
数
单个数字是最简单的表达式。解释器会直接打印出你输入的数字,如:
1 | 697 |
组合式
组合式是一种使用前缀表示的表达式,运算符在最前,如:
1 | (+ 5 99) |
104
这种表示方法的优点之一是能够传入任意个实参:
1
(+ 1 2 3 4)
10
第二个优点是能够嵌套组合式:
1
(+ (* 1 2) (- 4 3))
3
定义变量
通过define
定义变量:
1 | ; 定义两个变量 |
62.8318
定义过程
定义过程的格式如下:
1 | (define (<name> <formal parameters>) <body>) |
如:
1 | ; 定义过程`square` |
25
条件表达式
cond
使用cond
进行分情况(condition)分析,使用形式为关键字cond
后接一些子句
,子句
为括号()
括起来的表达式对偶(<p> <e>)
,每个表达式对偶的第一个表达式是一个谓词
,将被解释为true
(#t
)或false
(#f
),如下:
1 | (cond (<p1> <e1>) |
cond
条件表达式在求值时先求谓词<p1>
,如果其值为 false
则求<p2>
,如果<p2>
的值也为false
则求<p3>
,直到找到一个值为真的谓词,解释器返回子句对应的后继表达式<e>
的值作为条件表达式的值。如果没有<p>
为真,则cond
的值未定义。
使用cond
实现求绝对值函数的代码如下:
1 | (define (abs x) |
else
else
可以用来代替cond
的最后一个子句<p>
。如果所有先前的子句都为false
时返回else
相应的<e>
的值作为cond
子句的值。
当然,任何值为true
的表达式都可以代替最后一个子句<p>
,得到与else
类似的效果。
使用else
改写先前的求绝对值的代码如下:
1 | (define (abs x) |
if
if
可以在恰好有两种情况时使用。 if
表达式的一般形式是:
1 | (if <predicate> <consequent> <alternative>) |
使用if
改写先前求绝对值的代码如下:
1 | (define (abs x) |
逻辑表达式
以下列举and
or
not
3 个逻辑操作符的用法
1 | (and <e1> ... <en>) ; 从左到右计算`<e>`,若存在一个为假则整个表达式为假,有短路现象 |
循环
scheme
不提供循环相关的关键字。