PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
章节目录
LEARNING NOTES / 05

五个边界例子

独立、依赖、分支、错误和正常回退。

先运行 make demo,再运行 make explain。这里不新增 runtime 模式,只用小文件把当前边界讲清。每个文件都由 演示例子测试 同时走普通执行和 PLM,并使用 CLI 自己的工具注册表。

统一输入可用:

-inputs '{"item":"book","quantity":2,"delivery":false}'

1. 独立调用:order.py

源码:order.py

go run ./cmd/demo -source examples/order.py -plm -show-transformed

结果为 {"item":"book","total":47}。单价与运费参数互不依赖,两个 prepare 都可以在第一个 resolve 之前。赋值和结果交付顺序仍与原程序相同。

不要用这个瞬时 map 查询的用时说明加速。 重叠是否真实发生,由已有 channel 握手测试检查。

2. 依赖:dependency.py

源码:dependency.py

go run ./cmd/demo -source examples/dependency.py -plm -show-transformed

CLI 的固定快照多一个演示数据项 choose: "pen"。它仍是同一个 lookup 工具,不是新增 runtime capability 协议。

结果为 {"item":"pen","total":11}。观察转换:

  • 选择商品和固定运费可以先准备。
  • price 的参数是前一个结果 key,所以它的 prepare 必须在 key 完成赋值之后。
  • 不能为了并行就把未知的 key 猜成某个值。

3. 分支:branch.py

源码:branch.py

go run ./cmd/demo -source examples/branch.py -plm -show-transformed \
  -inputs '{"item":"book","quantity":2,"delivery":false}'

结果为 42。把 delivery 改为 true,按程序语义应加运费。观察 prepare 仍在 if 内,不能仅因为 AST 里出现了运费查询,就在未选分支提前执行它。

这里同时展示一个普通语句边界:if 的条件由 Python 决定,不交给 Go 预测。

4. 错误交付:error_delivery.py

源码:error_delivery.py

go run ./cmd/demo -source examples/error_delivery.py -plm -show-transformed

结果为 {"price":21,"caught":true}。第二个读取会失败,但错误只有到原调用处才交给 Python。因此进入 handler 时,前一个 price 已完成赋值。

要区分两种时间:Host 什么时候得到错误,与 Python 什么时候观察到错误。前者可以提前,后者不能随意移动。不要把提前失败自动重试成成功。

5. 不优化:fallback.py

源码:fallback.py

go run ./cmd/demo -source examples/fallback.py -plm -show-transformed

stderr 明确显示:

PLM: unchanged (no eligible rewrite)

stdout 为 24。循环正常执行,只是不在当前 pass 的优化范围内。空的 Transformed 不等于执行失败。

当前往程序里加入 print()、import 或对象方法也可能导致整段不优化;调试时先看 -show-transformed,不要把“加了打印之后没优化”误认成 Future 失效。我们没有为了演示扩张语法支持。

如何验证这些例子

make check
# 单独检查文档例子:
go test ./cmd/demo -run TestWalkthroughPrograms -count=1 -v
# 单独检查一个原有行为:
go test -run '^TestRealGuest/python$' -count=1

五个例子的结果和是否转换由测试检查。依赖、分支和错误时机的强语义仍由原有真实 Wasm 测试覆盖,不重新搭一套测试框架。