第 12 章 語言擴展
1 值的遞迴定義
(在 Objective Caml 1.00 中引入)
如第 11.7.2節所述,let rec 綁定結構除了定義遞迴函式外,還支援某些類別的非函式值的遞迴定義,例如
let rec name1 = 1 :: name2 and name2 = 2 :: name1 in expr 這會將 name1 綁定到循環列表 1::2::1::2::…,並將 name2 綁定到循環列表 2::1::2::1::…。非正式地說,接受的定義類別包含那些已定義名稱僅出現在函式主體內或作為資料建構子的引數的定義。
更精確地說,考慮表達式
如果 expr1 … exprn 中的每一個都對於 name1 … namen 是靜態可建構的、未直接連結到 name1 … namen 中的任何一個,且不是其引數具有抽象類型的陣列建構子,則將接受此表達式。
如果以下至少一個條件為真,則表示表達式 e 對於變數 name1 … namen 是靜態可建構的
-
e 沒有 name1 … namen 中的任何自由出現
- e 是一個變數
- e 的形式為 fun … -> …
- e 的形式為 function … -> …
- e 的形式為 lazy ( … )
- e 具有以下形式之一,其中 expr1 … exprm 中的每一個都對於 name1 … namen 是靜態可建構的,且 expr0 對於 name1 … namen、xname1 … xnamem 是靜態可建構的
在以下情況下,表示表達式 e 直接連結到變數 name
-
e 是 name
- e 的形式為 expr1; … ; exprm,其中 exprm 直接連結到 name
- e 的形式為 let [rec] xname1 = expr1 and … and xnamem = exprm in expr0,其中 expr0 直接連結到 name 或 xnamei 中的一個,使得 expri 直接連結到 name。
版權所有 © 2024 法國國家資訊與自動化研究所