第 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 中引入)

浮點數字面值::= ...
  [-] (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] 的單字母識別符的整數和浮點數字面值是僅限擴展的字面值。