对于动态作用域和词法(静态)作用域,OCaml 表达式 let x =5 in (let x =6 in x) 的计算结果是否不同?
除了在函数应用程序/函数闭包中之外,表达式对于动态作用域和词法作用域的评估何时会有所不同?
让我们稍微重新格式化一下你的例子:
let x = 5 in
let x = 6 in
x
这是 OCaml 中的一个表达式,并且
let x = 6 in x
本地绑定遮盖了第一个,因此这是有效的:
let x = 6 in x
或者只是:
6
这一切都不涉及函数应用,并且 OCaml 实现词法作用域而不是动态作用域。
假设它确实涉及函数。
let x = 6
let print_x () =
Format.printf "%d\n" x
函数
print_x
确实在程序中将x
绑定到值6
的部分创建了一个闭包。随后引入新的 x
绑定不会改变其行为。
当然,如果我们要使用显式可变状态,我们可以更改它。
let x = ref 6
let print_x () =
Format.printf "%d\n" !x
现在我们可以随后更新
x
并更改 print_x
的行为,只要名称 x
不被后续绑定遮盖即可。
为了避免这种可能性,您可能需要使用封装这部分程序的模块。
module X = struct
let x = ref 6
let print_x () =
Format.printf "%d\n" !x
end