第 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 法国国家信息与自动化研究所