第 12 章 语言扩展
16 仅扩展语法
(在 OCaml 4.02.2 中引入,在 4.03 中扩展)
在解析过程中会接受某些语法结构,但在类型检查过程中会被拒绝。因此,这些语法结构不能直接用在普通的 OCaml 中。但是,-ppx 重写器和其他外部工具可以利用解析器的这种宽松性,通过将这些新的语法结构重写为普通的结构,来扩展语言。
16.1 扩展运算符
(在 OCaml 4.02.2 中引入,在 OCaml 4.12.0 中扩展为一元运算符)
有两种类型的运算符可用于扩展:以 # 字符开头并包含多个 # 字符的中缀运算符,以及以 ?、~ 或 ! 字符开头并包含至少一个 # 字符的一元运算符。
例如
# let infix x y = x##y;;
Error: ## 不是有效的标识符。
# let prefix x = !#x;;
Error: !# 不是有效的标识符。
请注意,## 和 !# 都必须由 ppx 重写器消除,才能使此示例有效。
16.2 扩展字面量
(在 OCaml 4.03 中引入)
浮点字面量 | ::= |
...
|
| ∣ | [-] (0…9) { 0…9 ∣ _ } [. { 0…9 ∣ _ }] [(e ∣ E) [+ ∣ -] (0…9) { 0…9 ∣ _ }] [g…z ∣ G…Z] |
| ∣ | [-] (0x ∣ 0X) (0…9 ∣ A…F ∣ a…f) { 0…9 ∣ A…F ∣ a…f ∣ _ } [. { 0…9 ∣ A…F ∣ a…f ∣ _ }] [(p ∣ P) [+ ∣ -] (0…9) { 0…9 ∣ _ }] [g…z ∣ G…Z] |
|
整数字面量 | ::= |
...
|
| ∣ | [-] (0…9) { 0…9 ∣ _ }[g…z ∣ G…Z] |
| ∣ | [-] (0x ∣ 0X) (0…9 ∣ A…F ∣ a…f) { 0…9 ∣ A…F ∣ a…f ∣ _ } [g…z ∣ G…Z] |
| ∣ | [-] (0o ∣ 0O) (0…7) { 0…7 ∣ _ } [g…z ∣ G…Z] |
| ∣ | [-] (0b ∣ 0B) (0…1) { 0…1 ∣ _ } [g…z ∣ G…Z] |
|
|
后面跟着一个字母标识符(在 [g..z∣G..Z] 范围内)的整数字面量和浮点字面量是仅扩展的字面量。
版权所有 © 2024 法国国家信息与自动化研究院