第7天 添加函数功能
第7天 添加函数功能围绕扩充语法规则、作用域与生存周期、执行函数、计算斐波那契数、为闭包提供支持、实现闭包推进Stone语言,实现从源文本、Token、AST到求值、优化或代码生成的可回归增量。 覆盖7个正式目录层级。
为什么不能只看最终输出
、、、、共同构成本页坐标。第7天 添加函数功能围绕扩充语法规则、作用域与生存周期、执行函数、计算斐波那契数、为闭包提供支持、实现闭包推进Stone语言,实现从源文本、Token、AST到求值、优化或代码生成的可回归增量。
最终输出相同不代表实现相同:词法器可能吞掉错误字符,解析器可能生成错误结合性的树,解释器可能从调用点而非定义点捕获环境,优化器也可能只在当前样本上碰巧得到正确值。因此每次增量都保留源文本、Token范围、AST快照、环境或帧状态、标准输出、错误输出与退出状态。
Stone增量实现台账
先冻结上一日全部样本和公开接口,再为本日功能写一个最小成功程序、一个边界程序、一个故意失败程序和一个跨功能程序。成功样本证明新语法能到达执行层;边界样本暴露空输入、嵌套、遮蔽、短路、越界或缓存失效;失败样本必须在最早确定的位置停止;跨功能样本防止新节点破坏旧的表达式、控制流与函数语义。
处理流水线分为六个可观察检查点:源字符是否完整消费,Token是否携带类型和值及源位置,文法是否选择唯一分支,AST是否表达优先级与作用域,运行环境或虚拟机是否遵守所有权和调用约定,最终值与错误是否满足语言合同。只记录最终打印文本会丢失前五层最有诊断价值的证据。
每个错误对象至少含阶段、源文件、行列范围、实际符号、期望集合、原因和恢复建议。不要在底层捕获后返回null继续执行,因为后续空指针会掩盖真正错误;也不要把Java反射异常原样暴露给Stone程序,而应保留cause并映射为稳定的语言错误类别。
性能增量采用差分验证:同一语料分别运行基线解释器和优化版本,先比较值、输出、错误类别与位置,再比较预热后的时间、分配量与查找次数。若槽位分配、内联缓存或字节码改变异常顺序,性能再高也不能通过语义验收。
每次提交还要附带增量契约:本日新增哪些Token、文法产生式、AST节点、环境槽位、虚拟指令或类型规则,哪些旧接口保持不变,失败后如何回退到上一日可运行状态。将生成的Token、AST或字节码快照纳入版本比较,但不把快照更新本身当成修复;先解释结构变化为何符合语言设计,再接受新的基线。这样可把19天连续演进变成可二分、可撤销、可复查的工程历史。
六阶段证据链
1. 扩展函数语法
围绕扩充语法规则保存输入、结构化中间状态与输出。进入“捕获词法环境”前,先断言当前检查点成立并记录首个偏离。
2. 捕获词法环境
围绕作用域与生存周期保存输入、结构化中间状态与输出。进入“建立调用帧”前,先断言当前检查点成立并记录首个偏离。
3. 建立调用帧
围绕执行函数保存输入、结构化中间状态与输出。进入“绑定实参形参”前,先断言当前检查点成立并记录首个偏离。
4. 绑定实参形参
围绕计算斐波那契数保存输入、结构化中间状态与输出。进入“返回结果”前,先断言当前检查点成立并记录首个偏离。
5. 返回结果
围绕为闭包提供支持保存输入、结构化中间状态与输出。进入“检查闭包生存期”前,先断言当前检查点成立并记录首个偏离。
6. 检查闭包生存期
围绕扩充语法规则保存输入、结构化中间状态与输出。进入“扩展函数语法”前,先断言当前检查点成立并记录首个偏离。
可运行骨架
def counter(start) {
n = start
fun(step) { n = n + step }
}
next = counter(10)
next(2)global -> counter call frame -> captured frame(n=12)
-> closure(step)java stone.FuncInterpreter < samples/closure.stone
java stone.FuncInterpreter < samples/recursive.stone正式目录逐项讲解
第7天 添加函数功能
“第7天 添加函数功能”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“扩充语法规则”服务于“扩展函数语法”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“捕获词法环境”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.1 扩充语法规则
“7.1 扩充语法规则”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“作用域与生存周期”服务于“捕获词法环境”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“建立调用帧”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.2 作用域与生存周期
“7.2 作用域与生存周期”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“执行函数”服务于“建立调用帧”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“绑定实参形参”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.3 执行函数
“7.3 执行函数”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“计算斐波那契数”服务于“绑定实参形参”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“返回结果”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.4 计算斐波那契数
“7.4 计算斐波那契数”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“为闭包提供支持”服务于“返回结果”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“检查闭包生存期”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.5 为闭包提供支持
“7.5 为闭包提供支持”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“扩充语法规则”服务于“检查闭包生存期”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“扩展函数语法”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
7.6 实现闭包
“7.6 实现闭包”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“作用域与生存周期”服务于“扩展函数语法”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“捕获词法环境”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
分步视觉验证
常见误区
四类样本与验收
| 样本 | 只改变什么 | 必查证据 | 通过条件 |
|---|---|---|---|
| 正常 | 一个最小语言功能 | Token、AST、状态与输出 | 与手工预测一致 |
| 边界 | 空值、嵌套、遮蔽或规模 | 首个边界分支与源位置 | 边界可解释 |
| 非法 | 一个字符、规则、绑定或类型 | 最早错误类别与期望集合 | 不继续污染状态 |
| 回归 | 与上一日相同语料 | 结构、值、错误与性能基线 | 旧语义保持 |
练习
小结
- 扩充语法规则:连接“扩展函数语法”的源文本、中间结构、运行状态与回归证据。
- 作用域与生存周期:连接“捕获词法环境”的源文本、中间结构、运行状态与回归证据。
- 执行函数:连接“建立调用帧”的源文本、中间结构、运行状态与回归证据。
- 计算斐波那契数:连接“绑定实参形参”的源文本、中间结构、运行状态与回归证据。
- 为闭包提供支持:连接“返回结果”的源文本、中间结构、运行状态与回归证据。
- 本页7个正式目录层级全部进入Stone可运行增量与差分回归链。