表达式

介绍 Racket 表达式、组合式、运算符与操作数的概念,以及前缀表示法与 read-eval-print 循环。

什么是表达式?

表达式(expression)是你在 Racket 解释器中输入的任何内容。

例如,

2

就是一个表达式。同理,

(+ 2 3)

也是表达式。

如上所示,组合式(combination)是一种用括号表示过程调用的表达式。这种情形下被调用的过程(此处为 +)称为运算符(operator),而实参(此处为 2 和 3)称为操作数(operand)。组合式的值是通过将运算符应用于操作数得到的。

前缀表示法

你在 Unit 0.1 中已经接触过前缀表示法(prefix notation),这里简单回顾一下。

在 Racket 中,我们使用前缀表示法。因此,不在解释器中输入 2 + 3,而是输入 (+ 2 3)——也就是说,运算符位于操作数(或称实参)之前。

这有几个好处。眼下最明显的一个是:它可以接受像 + 或 * 这样实参个数可变的过程。例如,用前缀表示法把 5 个数相加写作 (+ 1 2 3 4 5),而用中缀表示法则要写成 1 + 2 + 3 + 4 + 5。

另一个好处是,它让过程之间的嵌套(nesting)变得非常容易。例如,(+ (- 4 3) (/ 4 2)) 求值为 3。这类表达式的嵌套深度可以任意扩展,因此

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

也是一个合法的 Racket 表达式,尽管对我们人类来说它很难看懂。

还有一个优点是,它让 Racket 的解析(parsing)变得非常容易,这在编写解释器时很有用。如果你还不知道这是什么意思,不用担心。

即使面对最复杂的表达式,解释器做的事情也一样:读取表达式、求值,然后把结果打印到屏幕上。这就是所谓的读取-求值-打印循环(read-eval-print loop)。