- 💭 写在前面:本章我们将继续讲解函数式语言,介绍比上一章更复杂的 let-in 示例,进行分析。并讲解作用域,通过例子对比静态作用域和动态作用域的区别。
目录
0x00 复杂的 let-in 示例
0x01 作用域
0x02 静态作用域 vs. 动态作用域
0x00 复杂的 let-in 示例
分析每行环境如何变化:
- 第 2~7 行中的整个表达式在 {𝑥 ↦ 10} 下进行评估
- 第 5 行中的 x + z 表达式在 {𝑥 ↦ 1, 𝑧 ↦ 2} 下进行评估
- 第 7 行中的 x + y 表达式在 {𝑥 ↦ 10, 𝑦 ↦ 3} 下进行评估
你还必须能够绘制推导树来证明这个程序最终被评估为 13(即,𝝓 ⊢ 𝒆 ⇓ 𝟏𝟑)
0x01 作用域
在前面的示例中,我们可以考虑每个名称有效的区域(这样的区域称为作用域)
- 第一个 x(第 1 行的)在 2 - 7 行中全都有效
- 第二个 x(第 3 行的)只在 4 - 5 行中有效
此外,名称 z 只在第 5 行有效,因此,如果我们在第 7 行写入 z + y,将会出现错误。
0x02 静态作用域 vs. 动态作用域
决定作用域也可以看作是解决名称冲突的问题。
在第 3 行的 x + n 中,n 指的是哪一个?第一个 n (第 1 行的) ?还是第二个 n (第 5 行) ?
直觉上,自然会认为指的是第一个 n 。
这样的设计选择被称为静态作用域(大多数现代语言采用此方式)。
在具有动态作用域的语言中,n 指的是第二个 n,也就是说,它在运行时引用的是最近定义的 n:
静态和动态作用域的概念也存在于命令式编程语言中。
考虑以下 C 代码(当然了,C 就是使用静态作用域的)
如果 C 使用动态作用域,理解一个程序会变得困难,取决于选择的分支,n 可能是 20 或 30:
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2024.6.10
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . |