Racket 编程

1 部分 · Racket 核心

S-表达式与语法

S-表达式与语法

深入理解 Racket 的根本语法形式——符号表达式,以及点对和表的化简规则。

什么是 S-表达式

人类对世界的终极问题:世界上最基本的、不可再分的物质单位是什么?Racket 认为以下两种东西是原子性的:数和符号。

符号表达式的定义分为两种:

  1. 符号表达式是一个原子。
  2. 符号表达式 (x . y),其中 x 和 y 是其他的符号表达式。

点对与化简规则

原子通过组合形成各种复合的数据结构——pair,如 (a . b),用以聚合两个对象 a 和 b 组成的对。

符号表达式的化简规则:

  1. 如果一个圆点的右边紧接着一个左括号,那么可以把这个圆点、左括号以及它匹配的右括号一同去掉,换成一个空格。比如 (b . (c . d)) 简写为 (b c . d)
  2. 如果一个圆点的右边紧邻着原子 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 代码的基本能力。