词法与动态作用域

问题描述 投票:0回答:1

对于动态作用域和词法(静态)作用域,OCaml 表达式 let x =5 in (let x =6 in x) 的计算结果是否不同?

除了在函数应用程序/函数闭包中之外,表达式对于动态作用域和词法作用域的评估何时会有所不同?

ocaml lexical-scope dynamic-scope
1个回答
0
投票

让我们稍微重新格式化一下你的例子:

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
© www.soinside.com 2019 - 2024. All rights reserved.