第 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;;
錯誤: ## 不是有效的數值識別符。
# let prefix x = !#x;;
錯誤: !# 不是有效的數值識別符。
請注意,## 和 !# 都必須由 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 法國國家資訊與自動化研究所