第 12 章 语言扩展

16 仅扩展语法

(在 OCaml 4.02.2 中引入,在 4.03 中扩展)

在解析过程中会接受某些语法结构,但在类型检查过程中会被拒绝。因此,这些语法结构不能直接用在普通的 OCaml 中。但是,-ppx 重写器和其他外部工具可以利用解析器的这种宽松性,通过将这些新的语法结构重写为普通的结构,来扩展语言。

16.1 扩展运算符

(在 OCaml 4.02.2 中引入,在 OCaml 4.12.0 中扩展为一元运算符)

中缀符号::= ...
 # { operator-char } # { operator-char ∣ # }
 
前缀符号::= ...
  (? ∣ ~ ∣ !) { operator-char } # { operator-char ∣ # }
 

有两种类型的运算符可用于扩展:以 # 字符开头并包含多个 # 字符的中缀运算符,以及以 ?~! 字符开头并包含至少一个 # 字符的一元运算符。

例如

# let infix x y = x##y;;
Error: ## 不是有效的标识符。
# let prefix x = !#x;;
Error: !# 不是有效的标识符。

请注意,##!# 都必须由 ppx 重写器消除,才能使此示例有效。

16.2 扩展字面量

(在 OCaml 4.03 中引入)

浮点字面量::= ...
  [-] (09) { 09 ∣ _ } [. { 09 ∣ _ }] [(e ∣ E) [+ ∣ -] (09) { 09 ∣ _ }] [gz ∣ GZ]
  [-] (0x ∣ 0X) (09 ∣ AF ∣ af) { 09 ∣ AF ∣ af ∣ _ } [. { 09 ∣ AF ∣ af ∣ _ }] [(p ∣ P) [+ ∣ -] (09) { 09 ∣ _ }] [gz ∣ GZ]
 
整数字面量::= ...
  [-] (09) { 09 ∣ _ }[gz ∣ GZ]
  [-] (0x ∣ 0X) (09 ∣ AF ∣ af) { 09 ∣ AF ∣ af ∣ _ } [gz ∣ GZ]
  [-] (0o ∣ 0O) (07) { 07 ∣ _ } [gz ∣ GZ]
  [-] (0b ∣ 0B) (01) { 01 ∣ _ } [gz ∣ GZ]
 

后面跟着一个字母标识符(在 [g..zG..Z] 范围内)的整数字面量和浮点字面量是仅扩展的字面量。