4.1 记法
本章(以及本文档的剩余部分)中使用的文法与Racket 精要 一章中基于字符的语法稍微有些不同。使用语法形式 something 的文法如下:
(something [id ...+] an-expr ...)
在此规范中,斜体的是元变量,使用 Racket 标识符的语法,如 id 和 an-expr。因此 an-expr 是一个元变量。 命名约定隐式地定义了各种元变量的含义:
以 id 结尾的元变量为标识符,如 x 或 my-favorite-martian。
以 keyword 结尾的元变量为关键字,如 #:tag。
以 expr 结尾的元变量为任意子形式,它会被解析为表达式。
以 body 结尾的元变量为任意子形式,它会被解析为局部定义或表达式二者其一。 仅当 body 前面没有任何表达式时,它才会被解析为定义,而最后一个 body 必定为表达式。另见 内部定义。
文法中的方括号表示带括号的形式序列,按照约定,形式序列通常使用方括号来表示。 换句话说,方括号并不表示语法形式中可选的部分。
... 表示之前形式的零或多次重复,而 ...+ 表示之前数据的一到多次重复。其它情况下,非斜体的标识符表示其自身。
下面是一些遵守以上文法的示例:
(something [x]) (something [x] (+ 1 2)) (something [x my-favorite-martian x] (+ 1 2) #f)
有些语法形式规范指代了未隐式定义且之前未定义的元变量。这些元变量在主形式之后定义, 使用类 BNF 的格式:
(something-else [thing ...+] an-expr ...)
thing = thing-id | thing-keyword
上面的示例表示,在形式 something-else 中,thing 为标识符或关键字二者其一。