|
| 1 | +> 全书 457 个 racket 代码块的三轮自动验证记录 : 方法、统计、15 处实锤修复、剩余“失败”的形态归类。目标只有一个——全书代码无一处胡编乱造。 |
| 2 | +
|
| 3 | +## 验证方法 |
| 4 | + |
| 5 | +三轮工具链 (脚本放系统临时目录 , 一次性使用 , 不进书): |
| 6 | + |
| 7 | +| 轮次 | 策略 | 解决什么 | |
| 8 | +|------|------|----------| |
| 9 | +| 第一轮 | 整章拼装运行 | 暴露全部可疑点 | |
| 10 | +| 第二轮 | 顶层名冲突自动分段 | 消解“同章多版本演进”造成的 `identifier already defined` 假失败 | |
| 11 | +| 第三轮 | 逐块独立运行 + 错误分类 | 把失败精确定位到块 , 区分语法级/依赖级/运行时级 | |
| 12 | + |
| 13 | +配套手段 :racket 实测定论 (契约语法、`disconnect` API、scribble reader 行为)、括号栈逐字符跟踪器 (比肉眼数括号可靠——第 16 章的修复位置就是靠它定案的)。 |
| 14 | + |
| 15 | +## 统计 (2026-08-13) |
| 16 | + |
| 17 | +- 总文件 :71(60 章正文 + 11 附录) |
| 18 | +- racket 代码块 : 原 457 个 , 标签修正后 437 个 (20 个非代码块改标 `text`/`bash`) |
| 19 | +- **语法级错误 :0**(修复 15 处后复验通过) |
| 20 | +- 纯计算类代码块 : 全部通过自动验证 |
| 21 | +- 依赖前文的片段 (约 120 块): 书的教学形态 , 读者按正文顺序跟跑即正常 |
| 22 | +- 需环境类 (约 38 块):GUI / Web / FFI / 第三方包 , 见下文清单 |
| 23 | + |
| 24 | +## 实锤修复清单 (15 处) |
| 25 | + |
| 26 | +| # | 章 | 问题 | 修复 | |
| 27 | +|---|-----|------|------| |
| 28 | +| 1 | 第 7 章 | 字符字面量写成 `# \a`(多一个空格),reader 直接报错 | 改为 `#\a` | |
| 29 | +| 2 | 第 9 章 | `#:guard` 的 `λ` 闭合处多 1 个右括号 | 删 1 个 `)` | |
| 30 | +| 3 | 第 14 章 | `demo-tree` 缺 1 个右括号 , 读者跟跑必报错 | 补 `)`, 复验 `tree-sum` 返回 10 | |
| 31 | +| 4 | 第 16 章 | `tree-height` 的 `λ` 在 `]` 前未闭合 | `]` 前补 1 个 `)`, 复验结构正确 | |
| 32 | +| 5 | 第 17 章 | `let-values` 教了不存在的 dotted rest 语法 , 示例结果 `'(1 2 (3 4))` 是虚构的 ;`define-values` 同样不支持 | 删虚构示例 , 正文改为讲清“个数必须严丝合缝”, 补正确方案 `call-with-values` + `(λ args ...)`(实测返回 `'(1 2 (3 4))`) | |
| 33 | +| 6 | 第 46 章 | 官方文档签名排版 (`→ any`、参数类型行)标成了 ```racket,读者复制必炸 | 改标 ```text | |
| 34 | +| 7 | 第 48 章 | `#lang racket/base` 下用 `contract-out` 但缺 `(require racket/contract)` | 补 require, 实测通过 | |
| 35 | +| 8 | 第 52 章 | 用了不存在的 `close-connection` | 改为 db 库正确的 `disconnect` | |
| 36 | +| 9 | 第 50 章 | 全章 15 个块是编辑器操作演示 (`\|` 表光标、按键前后对照), 标成 ```racket | 全部改标 ```text | |
| 37 | +| 10 | 第 53 章 | `(request) -> response` 类型签名示意标成 ```racket | 改标 ```text | |
| 38 | +| 11 | 第 57 章 | xexpr 文法产生式 (EBNF 风格)标成 ```racket,`(tag ...)` 撞上 unit 关键字 | 改标 ```text | |
| 39 | +| 12 | 第 60 章 | 命令行命令标成 ```racket | 改标 ```bash | |
| 40 | +| 13 | 第 38 章 | scribble 示例只在注释里描述 `@section`, 且注释中的 `@` 会触发 scribble reader 解析错误 (实测) | 改为真实可运行的 scribble 代码 (`@section{...}` + `@bold{...}`, 实测通过) | |
| 41 | +| 14 | 附录·Noise(一) | Noise `serve` 源码转录缺 2 个右括号 | 补齐 , 栈跟踪复验平衡 | |
| 42 | +| 15 | 附录·Noise(七) | 空 body 的代码骨架示意标成 ```racket | 改标 ```text | |
| 43 | + |
| 44 | +## 剩余“失败”的形态归类 (均非 bug) |
| 45 | + |
| 46 | +- **故意错误示例**(教学设计 , 勿修): 第 4 章 `squre` 拼写演示、第 9 章 guard 报错行、第 40 章 `(twice 10 (/ 1 0))` 引出惰性求值动机、异常章的报错演示 |
| 47 | +- **`#lang` 文件内容展示**(第 38/39 章、附录二): 块展示的是“另一个文件里写什么”, 读者存成独立文件即可跑 , 拼进当前模块才报错 |
| 48 | +- **依赖前文的片段**: 后块用前块的 `define`/`struct`, 是书“跟着敲”的教学形态 |
| 49 | +- **同章演进版本**: 同一函数的命令式版/函数式版先后出现 (如第 13 章 `double-evens`) |
| 50 | +- **文件依赖**(第 39 章 include、第 44 章 `require "math.rkt"`):需读者先创建文件 , 正文有指引 |
| 51 | + |
| 52 | +## 需环境块清单 (建议本机复验) |
| 53 | + |
| 54 | +- **GUI**(约 28 块): 第 28-34 章——正好对应 `GUI截图待补清单.md` 的 7 篇截图任务 , 跑截图时顺带复验 |
| 55 | +- **Web**(约 8 块): 第 53-57 章 (需启动服务器观察) |
| 56 | +- **FFI**(5 块): 第 58 章 (需 C 编译环境) |
| 57 | +- **第三方包**: 第 12/33 章 `threading`、第 55 章 `koyo`、附录 Noise 系列 (`raco pkg install` 后可复验) |
| 58 | + |
| 59 | +## 后续建议 |
| 60 | + |
| 61 | +1. **格式卫生**: 第 19 章有 47 处 cjk-spacing(正文用半角 `" "` 包裹中文术语所致 , 其余章节大多干净)。根治方案是全书统一改用中文弯引号——属风格决策 , 待确认后执行 |
| 62 | +2. **内容审读**: 代码层已干净 , 下一层是“代码 - 文字一致性”(文字宣称的结果 vs 代码实际输出)与关键事实论断核查 , 按卷推进 |
| 63 | +3. **本报告随修复持续更新** |
0 commit comments