第 1 部分 · Racket 核心
S-表达式与语法
S-表达式与语法
深入理解 Racket 的根本语法形式——符号表达式,以及点对和表的化简规则。
什么是 S-表达式
人类对世界的终极问题:世界上最基本的、不可再分的物质单位是什么?Racket 认为以下两种东西是原子性的:数和符号。
符号表达式的定义分为两种:
- 符号表达式是一个原子。
- 符号表达式
(x . y),其中 x 和 y 是其他的符号表达式。
点对与化简规则
原子通过组合形成各种复合的数据结构——pair,如 (a . b),用以聚合两个对象 a 和 b 组成的对。
符号表达式的化简规则:
- 如果一个圆点的右边紧接着一个左括号,那么可以把这个圆点、左括号以及它匹配的右括号一同去掉,换成一个空格。比如
(b . (c . d))简写为(b c . d)。 - 如果一个圆点的右边紧邻着原子 null,那么就可以把这个圆点连同 null 一同去掉。例如
(a . null)简写为(a)。
列表——最常用的 S-表达式
表是最常用的一种特殊类型的符号表达式。一个非原子的符号表达式经过适当简写以后可以把全部圆点都略去,就说这个符号表达式是表。
#lang racket ;; 点对表示法 (cons 1 2) ; => '(1 . 2) (cons 1 (cons 2 (cons 3 '()))) ; => '(1 2 3) ;; 列表就是嵌套的点对 '(1 2 3) ; 等价于 (cons 1 (cons 2 (cons 3 '()))) '(a b c) ; 符号列表 '((1 2) (3 4)) ; 嵌套列表
前缀记法
Racket 使用一致的前缀记法——运算符始终在最前面:
(+ 1 2 3) ; => 6 (* 2 3 4) ; => 24 (> 5 3) ; => #t (string-length "hello") ; => 5
小结
S-表达式是 Racket 的语法基石。理解了点对、化简规则和列表,你就掌握了阅读 Racket 代码的基本能力。