scheme基础

schemelisp的一种方言,lisp是 LISt Process 的缩写。本文介绍scheme的基础语法便于后续研究。

表达式

单个数字是最简单的表达式。解释器会直接打印出你输入的数字,如:

1
697

组合式

组合式是一种使用前缀表示的表达式,运算符在最前,如:

1
(+ 5 99)

104

  • 这种表示方法的优点之一是能够传入任意个实参:

    1
    (+ 1 2 3 4)

    10

  • 第二个优点是能够嵌套组合式:

    1
    (+ (* 1 2) (- 4 3))

    3

定义变量

通过define定义变量:

1
2
3
4
5
6
; 定义两个变量
(define pi 3.14159)
(define radius 10)

; 使用刚才定义的变量计算圆的周长并输出结果
(define circumference (* 2 pi radius))

62.8318

定义过程

定义过程的格式如下:

1
(define (<name> <formal parameters>) <body>)

如:

1
2
3
4
5
; 定义过程`square`
(define (square x) (* x x))

; 使用定义的过程并输出结果
(square 5)

25

条件表达式

cond

使用cond进行分情况(condition)分析,使用形式为关键字cond后接一些子句子句为括号()括起来的表达式对偶(<p> <e>),每个表达式对偶的第一个表达式是一个谓词,将被解释为true#t)或false#f),如下:

1
2
3
4
(cond (<p1> <e1>)
(<p2> <e2>)
...
(<pn> <en>))

cond条件表达式在求值时先求谓词<p1>,如果其值为 false则求<p2>,如果<p2>的值也为false则求<p3>,直到找到一个值为真的谓词,解释器返回子句对应的后继表达式<e>的值作为条件表达式的值。如果没有<p>为真,则cond的值未定义

使用cond实现求绝对值函数的代码如下:

1
2
3
4
(define (abs x)
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (- x))))

else

else可以用来代替cond的最后一个子句<p>。如果所有先前的子句都为false时返回else相应的<e>的值作为cond子句的值。
当然,任何值为true的表达式都可以代替最后一个子句<p>得到与else类似的效果。

使用else改写先前的求绝对值的代码如下:

1
2
3
(define (abs x)
(cond ((< x 0) (- x))
(else x)))

if

if可以在恰好有两种情况时使用。 if表达式的一般形式是:

1
(if <predicate> <consequent> <alternative>)

使用if改写先前求绝对值的代码如下:

1
2
3
4
(define (abs x)
(if (< x 0)
(- x)
x))

逻辑表达式

以下列举and or not 3 个逻辑操作符的用法

1
2
3
(and <e1> ... <en>)  ; 从左到右计算`<e>`,若存在一个为假则整个表达式为假,有短路现象
(or <e1> ... <en>) ; 从左到右计算`<e>`,若存在一个为真则整个表达式为真,有短路现象
(not <e>)

循环

scheme不提供循环相关的关键字。