Skip to content

Commit 19832e0

Browse files
Preserve book outline and QA report under meta/, re-attach screenshot TODOs
1 parent 98318af commit 19832e0

9 files changed

Lines changed: 288 additions & 0 deletions

File tree

‎content/part-1/4.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,5 @@ DrRacket 会高亮出错的位置,告诉你 `squre` 是个“未绑定的标
109109
Racket 的错误信息在所有语言里算很讲人话的那一档:位置准、提示具体。**养成读错误信息的习惯,比改完就跑更重要。**
110110

111111
> 装好、会跑、看得懂报错——你已经在 Racket 里站稳了。下一篇先讲那满屏括号到底在搭什么结构,再往下才轮到数据和语法。
112+
113+
> 📷 待补运行截图:DrRacket 主界面:上半定义区写代码、下半交互区(REPL)跑结果,两扇窗同框(`drracket-two-panes-definition-interaction.png`)

‎content/part-5/28.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,5 @@ GUI 的界面是一堆“东西”:窗口、文字、按钮,各有各的样
137137
理解了这一点,你再看任何一个 GUI 程序,结构都长一个样:一堆控件对象组成界面,一组回调定义行为,一个事件循环把它们串起来。剩下的都是细节。
138138

139139
> 你已经有了一个能点、能数、能响应的窗口——窗口、控件、回调三件套都到齐了,再加上一个事件循环,整个 GUI 的骨架就立起来了。但你会发现,这个窗口长得不太像你日常用的那些界面。为什么 Racket 的 GUI 默认写不出“现代界面”?下一篇拆这个扣。
140+
141+
> 📷 待补运行截图:点击计数器窗口运行效果:一个按钮 + 一个显示次数的 message,点几次后次数累加(`racket-gui-click-counter.png`)

‎content/part-5/29.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,5 @@ HTML 里一个 `div` 套三个子元素就完事了。在 `racket/gui` 里,很
183183
如果你在 `racket/gui` 里组合了一堆控件、手动同步状态、还想让它们看起来像一个整体——说明你已经走错路了。下一步只有一个方向:用 canvas 自己画。
184184

185185
> Racket GUI 并不落后,它只是拒绝成为一个浏览器。当你开始用 canvas 写界面,你已经不是在“写界面”,而是在实现一个小型 UI 引擎。
186+
187+
> 📷 待补运行截图:racket/gui 拼 message% 排出的朴素列表项,与网页版现代任务项对比(`racket-gui-clunky-task-item.png`)

‎content/part-5/30.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,5 @@
177177
回到开头的问题:为什么选控件会让人卡住?因为人在按长相挑,而控件是按意图分的。下次面对一个空白面板,别先想“这里放个什么控件好看”,先问“用户对着这块区域要做什么”——答案一出来,8 个类里自然有一个对上号。
178178

179179
> 界面的复杂度不在控件多,而在意图清不清。把用户的动作想明白,控件自己会就位。
180+
181+
> 📷 待补运行截图:8 种控件外观九宫格:button% / message% / text-field% / check-box% / radio-box% / choice% / gauge% / canvas%(`racket-gui-eight-widgets-grid.png`)

‎content/part-5/31.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,5 @@
197197
跑起来你就有了一个用上输入框、勾选、单选、滑块、按钮和弹窗的完整小应用。
198198

199199
> 控件清单走完一圈。具体界面该挑哪个,去姊妹篇按语义选。
200+
201+
> 📷 待补运行截图:内置控件一览:frame% / panel% 系列 / 菜单 / 滑块 / 对话框等同框(`racket-gui-builtin-controls-overview.png`)

‎content/part-5/32.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,5 @@ canvas 被缩放时,系统会自动触发一次 `on-paint`——重画本身
244244
**`canvas%` 不是退而求其次,它是 `racket/gui` 里唯一让你从像素开始说话的地方。**
245245

246246
> 当你重写 `on-paint` 的那一刻,你写的就不是一个控件,而是一个微型 UI 引擎的一小块。
247+
248+
> 📷 待补运行截图:子类化 canvas% 自绘图形效果(`racket-gui-custom-canvas-drawing.png`)

‎content/part-5/33.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,5 @@ gui-easy 不是 `racket/gui` 的替代品,而是它外面的一层壳——底
173173
但当界面复杂到需要自定义绘图、精细焦点管理、或大量第三方 snip 时,命令式的 `racket/gui` 反而更直接——每个 View 都提供 `#:mixin` 关键字,随时能“下沉”回原生控件。声明式不是银弹,它只是在“状态驱动”这一层给了你更顺手的工具。
174174

175175
> 把状态看成 Observable,把界面看成 View 的声明,GUI 编程就从“组装控件”变成了“描述关系”——这正是函数式思维在界面里的落地。
176+
177+
> 📷 待补运行截图:gui-easy 声明式界面:Observable 驱动的文本框 ↔ 标签实时同步(`racket-gui-easy-reactive-sync.png`)

‎meta/book-outline.md‎

Lines changed: 211 additions & 0 deletions
Large diffs are not rendered by default.

‎meta/code-verification-report.md‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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

Comments
 (0)