2.7 KiB
EX-03 补全调用例子的上下文与结果
读者目标:理解后续调用如何使用前一次的结果。依据是当前 guide/09-functions-and-calls.md。函数与类型写法仍采用本书收录提案。
原稿
let amount = discountedPrice(price, discount)
return discountedPrice(amount, 5)
系统会自动搞定,最后拿到结果。
原稿缺少片段位置、函数声明、输入和结果,也没有指出读者应观察的数据依赖。
写作判断
先给依赖方函数声明,再给调用方归属与导入,最后用确定输入推演。无需介绍传输协议;需要保留名称可见性假设和提案状态。
成稿示范
组合两次定价调用
下面采用本书的函数语法提案,展示成功调用的结果依赖。跨 namespace 引用采用目标函数可见、名称无冲突的条件。
代码归属:atelier:shop.pricing。函数声明:
function discountedPrice(price: Number, discount: Number): Number {
return price - discount
}
该函数从 price 中扣除 discount,并返回数值结果;Number 沿用第 7 章的统一数值类型名提案。
代码归属:market:shop.checkout。导入与调用方声明:
use atelier:shop.pricing
function payable(price: Number, discount: Number): Number {
let amount = discountedPrice(price, discount)
return discountedPrice(amount, 5)
}
对于 payable 的输入 100 和 10,预期计算如下:
| 步骤 | 输入 | 成功结果 |
|---|---|---|
| 第一次 discountedPrice | 100、10 | 90,绑定到 amount |
| 第二次 discountedPrice | amount 为 90、优惠为 5 | 85,作为 payable 的返回值 |
第二次调用使用第一次的结果。因此,在 amount 的成功结果可用前,后续调用不能把它当作已取得的值使用。上述语义在 inflight 中体现;Preflight 检查调用目标、参数和返回类型等可静态判断的约束。
这里展示成功路径。失败、缺失、未就绪的具体处理语法仍按规范状态记录,不能将它们当作数值 0。仅凭这段数据依赖也不能推出所有函数参数的求值顺序。
反向验证
把输入换成 80 与 7:第一次得到 73,第二次得到 68。如果解释仍声称第一次固定返回 90,说明文字与规则没有连通。
检查例子没有为 Product 或其他 class 增加 get,没有使用未定义的 await、client 或官方导入路径。验证方式是按当前规则手算,未运行 Endorphin 程序。
采用的规则
DOC-004、009、010、011、013、015。代码、说明和结果表共同承担上下文与解释;不要求每个项目都单独显示一段“规则检查”。