跳到正文

遮蔽、捕获与重命名

52 分钟

遮蔽、捕获与重命名

先看一个程序为什么会这样运行

学习遮蔽、捕获与重命名时,我们从程序 let v23 = 5 in v23 + 2 出发。你先不要背术语,先预测扫描器看见什么、解析器建立什么树、环境保存什么绑定、求值器按什么顺序推进,以及错误应在哪一层报告。遮蔽、捕获与重命名的价值就在于把“语言好像懂了”变成一串可以画出、执行和反查的状态变化。

这一节属于第2章“名字、作用域与绑定”。前一节留下的制品是本节输入,下一节会直接依赖本节输出。请在纸上保留源程序、结构表示、环境或存储快照、一步求值和最终观察值;若只记最后答案,就看不见实现为何正确。

建立本节的语义对象

遮蔽、捕获与重命名首先要求区分表面写法与语义对象。表面字符串方便人书写,解释器却需要稳定结构:节点种类、子节点、名字、值和源位置。对 let v23 = 5 in v23 + 2,至少写出输入、当前环境、规则前提和输出。任何隐含默认值都要显式化,否则边界例会迫使实现猜测。

在遮蔽、捕获与重命名的规则卡上写成“若前提一与前提二成立,则对象在环境ρ与存储σ下产生值v和新状态σ'”。不同章节会增减ρ、σ、类型上下文Γ或并发配置,但读法不变:横线上是必须证明的前提,横线下是允许得到的结论。

跟着我执行一个完整例子

先给 let v23 = 5 in v23 + 2 编号每个词法单元,再画只保留语义信息的AST。随后建立初始环境ρ0,把声明引入的新绑定放入新帧ρ1。求值子表达式时逐步写 (表达式, 环境, 存储) → (表达式', 环境', 存储');若本节不需要存储,也要明确写“σ不变”,不能偷偷省略状态。

完成正常例后,把名字改成未绑定、把括号删掉、把值换成错误类型,并改变子表达式顺序。遮蔽、捕获与重命名的实现如果在四种变化下仍给出可定位诊断,说明规则不仅能跑通演示,也覆盖了失败边界。每次失败记录发生层次:扫描、解析、绑定、类型还是运行时。

可复用的实现制品

为遮蔽、捕获与重命名制作一张实现卡:输入格式;核心数据结构;规则前提;状态变化;返回值;错误种类;源位置;最小正常例;边界例;反例;复杂度;测试断言。代码提交旁再放一张三列表,左列写语法,中列写内部结构,右列写观察行为。

若遮蔽、捕获与重命名涉及递归过程,额外写终止度量;若涉及环境,画父指针;若涉及堆,画对象图;若涉及并发,列出允许交错。制品必须让同伴不读你的实现也能预测测试结果,这才是契约而非代码注释。

动手练习与在线验收

先完成遮蔽、捕获与重命名的单选、多选和情境推导题。单选辨别规则边界,多选补齐证据链,推导题按公开量表写状态序列。部分课时还有Python代码实验;代码题必须从标准输入读取、写标准输出,并通过至少四个内联测试,不能提交伪代码或依赖网络、文件和特权环境。

然后给遮蔽、捕获与重命名设计一个最小反例。反例应只改变一个因素,例如作用域、求值顺序、类型构造器、别名或调度次序。把预期与实际状态并排;若无法指出第一次分叉的位置,就继续缩小程序,而不是在大项目里加打印碰运气。

易错点与调试顺序

在遮蔽、捕获与重命名中,常见错误是把源文本等同AST、把名字等同位置、把位置等同值、把静态拒绝等同运行失败,或把一种语言的默认求值顺序套到另一种语言。另一个错误是只测最终值,不测错误位置、环境变化与副作用次数。

调试遮蔽、捕获与重命名时按前端结构、绑定、静态规则、单步状态、最终观察的顺序推进。每层先断言输入输出契约,再进入下一层。随机加入打印会改变惰性、并发或时序行为;结构化trace必须带节点id、环境帧、步骤号和源位置。

下课前自检

闭卷解释遮蔽、捕获与重命名的输入、输出、核心不变量和一个反例;为 let v23 = 5 in v23 + 2 画出至少三步状态;说明错误应在哪一层被发现;再写一个会让错误实现通过正常例却在边界处失败的测试。能够让同伴依据你的规则独立复现,才算通过。

最后把本节制品接回“名字、作用域与绑定”的章节图:标出它依赖哪一节,又为哪一节提供结构、环境、规则或测试。程序设计语言不是概念列表,而是一组彼此咬合的可执行语义;遮蔽、捕获与重命名必须成为其中一个可靠齿轮。

迁移到另一种语言设计

完成遮蔽、捕获与重命名后,再把同一规则迁移到一个不同表面语法:改变关键字、括号或数据构造器,但保持语义对象不变;随后反过来保持语法相似、改变求值或作用域规则。比较两次实验,说明哪些行为来自语法,哪些来自绑定、类型和动态语义。把差异写进测试名与诊断信息,避免实现者误把宿主语言习惯当目标语言规范。

Practice

本课练习

4

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

1单选:遮蔽、捕获与重命名 3

本题考查遮蔽、捕获与重命名。哪项实现证据最严格?

登录 后答题可以领积分
2多选:遮蔽、捕获与重命名 3

验收遮蔽、捕获与重命名时哪些证据必须保留?(漏选或多选均不得分。)

多选题:必须选全正确项,漏选或多选均不得分。

登录 后答题可以领积分
3推导:遮蔽、捕获与重命名 3

为遮蔽、捕获与重命名写一个最小程序,给出结构、至少三步环境/存储/机器状态变化、最终值和失败反例。

【学生可见评分量表(10分)】结构2分;状态步骤4分;结果与条件2分;反例2分。

登录 后答题可以领积分
4遮蔽、捕获与重命名阶段:遮蔽、捕获与重命名 4

遮蔽、捕获与重命名阶段的遮蔽、捕获与重命名中有6个节点,每节点访问5次,总访问次数是多少?

登录 后答题可以领积分