Structure and Interpretation of Computer Programs
23 讲全程中文笔记 + 21 份作业手把手解析。所有代码都跑过官方评分器。
0. 这份材料是什么
CS 61A 是伯克利的编程入门课,但它教的不是「Python 语法」,而是 一段代码被求值时到底发生了什么——名字如何绑定到值、 环境如何串成链、递归为什么可以信任、以及一门语言是怎么被另一门语言实现出来的。 这份材料按这个主线重写了全部课程内容。
- 凡是涉及求值的地方,都画出逐步过程:环境图、帧、递归展开到 base case 再逐层回代,不用「递归处理子问题」一句话糊弄过去。
- 作业解析的重点不是给答案,而是「怎么想到的」——包括走过的弯路:先想到什么、在哪种输入下会崩、于是怎么改。
- 常见误区写的是真实会犯的错和它的真实报错,不是「注意边界条件」这种空话。
1. 代码验证状态
所有 lab、homework 与项目的代码都在本仓库里真实实现,并用课程官方的
ok 自动评分器在本地跑过。
- 19 份作业 全部题目通过。
- lab00 与 hw03 各有一道 survey 题,需要课程给选课学生发放的私有口令(校外无法获得)。这两题必然不通过,页面上如实标注,没有伪造口令,也没有假装全绿;两份作业的其余题目均已通过。
- WWPD / Scheme WWSD 这类概念题的答案在官方测试文件里是 HMAC 哈希。本项目的做法是真的执行代码推出答案再与哈希比对(见
_src/unlock.py),对不上就标为未解决——所以笔记里讲的求值结果都是被证伪检验过的,不是凭印象写的。
2. 讲义笔记
表达式、调用、名字绑定,以及第一类错误信息
布尔值、短路求值、if/while,以及缩进为什么是语法
函数作为值传递与返回,lambda 与闭包的起点
环境图规则:帧、父帧、名字查找顺序
把问题交给「更小的自己」,以及为什么可以信任递归
一次调用分裂成多次调用,计数与枚举问题
列表、切片、列表推导式与序列上的常用操作
别名、就地修改,以及抽象屏障为什么值钱
用数据抽象表示树,递归处理树形结构
yield 如何把一个函数变成可暂停的过程
raise / try-except,以及把错误当控制流使用
前半程的串讲与典型题型梳理
class、实例属性与类属性、方法调用的求值过程
属性查找链、super()、__repr__ 与 __str__
把树写成类,用可变性维护树形结构
Link 类、递归与迭代两种遍历方式
计数调用、Θ 记号、记忆化与常见复杂度陷阱
一门只有表达式的语言:前缀记法与特殊形式
cons/car/cdr、点对表示法与递归构造
eval/apply 互递归——这门课的最高点
尾递归为什么不爆栈,宏如何改写代码本身
第 24–28 讲为特别专题(AI 编程工具、Web 应用、计算机安全)与期末复习,课程未公开对应幻灯片,故本站未收录。
3. Lab 解析
Python 环境、终端、ok 评分器的用法
while 循环、数位拆解、return 与 print 的分野
函数作为参数与返回值,lambda 的求值时机
列表操作与第一批真正的递归题
树递归的分支设计与树 ADT
别名陷阱与 yield 的执行顺序
类、实例属性与类属性的区别
把树写成类之后如何递归修改
Link 的递归与迭代两套写法
第一次用 Scheme 写递归
读懂求值器,写出尾递归
4. Homework 解析
5. 项目解析
6. 仓库结构
| 路径 | 内容 |
|---|---|
lecture-NN.html | 各讲学习笔记 |
lab-NN.html / hw-NN.html / proj-*.html | 作业解析 |
labs/ hw/ proj/ | 真实可运行的作业代码,含官方 ok 评分器 |
slides/lecture_NN/ | 官方幻灯片逐页图片 |
_src/unlock.py | 执行代码推导 WWPD 答案并与官方哈希比对 |
_src/grade.py | 批量跑 ok,产出 grade_report.json |
_src/validate.py | 校验 HTML 结构、图片存在性与代码转义 |
_src/SPEC.md | 写作规范 |
自己跑一遍
# 跑单份作业的官方评分器
cd labs/lab01 && python3 ok --local
# 批量评分,产出 _src/grade_report.json
python3 _src/grade.py
# 校验全部 HTML
python3 _src/validate.py