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不提供循环相关的关键字。