先运行 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
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 测试覆盖,不重新搭一套测试框架。