第 02 课 | 第二幕:计算引擎

⏱ 预计阅读 4 分钟 更新于 2026/5/7
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)

第二幕:计算引擎(第4-5集)

从空白 app.js 到完整的计算引擎

第4集:先写测试,再写代码

场景:第一行代码不是 function add(),是测试。

  • TDD 是什么:红灯 → 绿灯 → 重构(三步循环)
  • 第一个测试:expect(evaluate("2+3×4")).toBe(14)
  • 实现 tokenization:把 "2+3×4" 拆成 [2, +, 3, ×, 4]
  • 实现 shunting-yard:把中缀变后缀 [2, 3, 4, ×, +]
  • 实现 RPN 求值:2, 3×4=12, 2+12=14
  • 跑通第一个绿灯的感觉
  • 计划怎么来:/gsd-plan-phase 1 拆成 3 个 Plan,plan-checker 验证
  • 执行怎么来:/gsd-execute-phase 1 子 agent 并行,每个独立 200k 上下文
  • 核心概念:测试不是事后的补充,是设计的工具

产出文件

  • app.js — tokenization + shunting-yard + RPN 求值
  • tests/engine/parse.test.js — 解析器测试
  • tests/engine/evaluate.test.js — 求值器测试
  • .planning/phases/01/PLAN-01.md ~ PLAN-03.md — 3 个执行计划

对应命令/gsd-plan-phase 1/gsd-execute-phase 1 --auto


第5集:处理那些"边界情况"

场景:基础运算搞定了,但真实用户不会只算 2+3

  • 0.1 + 0.2 = 0.3(不是 0.300...04)—— 缩放整数精度方案实装
  • 5 ÷ 0 = Error —— 除零优雅处理,返回错误字符串而非抛异常
  • 100 + 5% 等于多少?—— 百分号有两种语义(加/减是比例,乘/除是除以100)
  • +/- 切换、括号嵌套、连续运算符替换
  • 结果格式化:12 位精度,去尾零,极小数避免科学记数法
  • 历史管理:FIFO 队列,最多 10 条,immutable return
  • /gsd-verify 1 目标回溯:从 Phase 目标倒查每个"必须为真"的陈述
  • 核心概念:边界情况才是主要工作

产出文件

  • app.js — 完整计算引擎(parse / evaluate / format / history)
  • tests/engine/format.test.js — 格式化测试
  • tests/engine/percent.test.js — 百分号测试
  • tests/engine/error.test.js — 错误处理测试
  • .planning/phases/01/VERIFICATION.md — 验证报告
  • .planning/phases/01/REVIEW.md — 代码审查报告

对应命令/gsd-execute-phase 1(续),/gsd-verify 1/gsd-code-review