目录

    序言

    第二版前言

    第一版前言

    致谢

    1  用过程构建抽象
        1.1  程序设计的基本元素
            1.1.1  表达式
            1.1.2  命名与环境
            1.1.3  组合式的求值
            1.1.4  复合过程
            1.1.5  过程应用的代换模型
            1.1.6  条件表达式和谓词
            1.1.7  实例:用牛顿法求平方根
            1.1.8  过程作为黑箱抽象
        1.2  过程与它们产生的计算过程
            1.2.1  线性的递归和迭代
            1.2.2  树形递归
            1.2.3  增长的阶
            1.2.4  求幂
            1.2.5  最大公约数
            1.2.6  实例:素数检测
        1.3  用高阶过程形成抽象
            1.3.1  过程作为参数
            1.3.2  用 Lambda 构造过程
            1.3.3  过程作为通用方法
            1.3.4  过程作为返回值

    2  用数据构建抽象
        2.1  数据抽象导引
            2.1.1  实例:有理数的算术运算
            2.1.2  抽象屏障
            2.1.3  数据是什么意思?
            2.1.4  扩展练习:区间算术
        2.2  层次性数据和闭包性质
            2.2.1  序列的表示
            2.2.2  层次性结构
            2.2.3  序列作为约定的界面
            2.2.4  实例:一种图形语言
        2.3  符号数据
            2.3.1  引号
            2.3.2  实例:符号求导
            2.3.3  实例:集合的表示
            2.3.4  实例:哈夫曼编码树
        2.4  抽象数据的多种表示
            2.4.1  复数的表示
            2.4.2  带标签的数据
            2.4.3  数据导向的程序设计和可加性
        2.5  带有通用操作的系统
            2.5.1  通用算术运算
            2.5.2  不同类型数据的组合
            2.5.3  实例:符号代数

    3  模块化、对象和状态
        3.1  赋值和局部状态
            3.1.1  局部状态变量
            3.1.2  引入赋值带来的利益
            3.1.3  引入赋值的代价
        3.2  求值的环境模型
            3.2.1  求值规则
            3.2.2  简单过程的应用
            3.2.3  框架作为局部状态的仓库
            3.2.4  内部定义
        3.3  用可变数据建模
            3.3.1  可变表结构
            3.3.2  队列的表示
            3.3.3  表格的表示
            3.3.4  数字电路模拟器
            3.3.5  约束传播
        3.4  并发:时间本质
            3.4.1  并发系统中时间的本质
            3.4.2  控制并发的机制
        3.5  流
            3.5.1  流是延迟的表
            3.5.2  无穷流
            3.5.3  流范式的利用
            3.5.4  流和延迟求值
            3.5.5  函数式程序的模块化和对象的模块化

    4  元语言抽象
        4.1  元循环求值器
            4.1.1  求值器的核心
            4.1.2  表达式的表示
            4.1.3  求值器的数据结构
            4.1.4  将求值器作为程序运行
            4.1.5  数据作为程序
            4.1.6  内部定义
            4.1.7  将语法分析与执行分离
        4.2  Scheme 的变形——惰性求值
            4.2.1  正则序和应用序
            4.2.2  带有惰性求值的解释器
            4.2.3  流作为惰性的表
        4.3  Scheme 的变形——非确定性计算
            4.3.1  Amb 和搜索
            4.3.2  非确定性程序的实例
            4.3.3  实现 Amb 求值器
        4.4  逻辑程序设计
            4.4.1  演绎信息检索
            4.4.2  查询系统如何工作
            4.4.3  逻辑程序设计是数学逻辑吗?
            4.4.4  实现查询系统

    5  用寄存器计算机进行计算
        5.1  设计寄存器计算机
            5.1.1  描述寄存器计算机的语言
            5.1.2  机器设计中的抽象
            5.1.3  子程序
            5.1.4  用栈实现递归
            5.1.5  指令总结
        5.2  寄存器计算机模拟器
            5.2.1  机器模型
            5.2.2  汇编器
            5.2.3  为指令生成执行过程
            5.2.4  监控机器性能
        5.3  存储分配和垃圾回收
            5.3.1  将存储器表示为向量
            5.3.2  维持无穷存储器的假象
        5.4  显式控制求值器
            5.4.1  显式控制求值器的核心
            5.4.2  序列求值和尾递归
            5.4.3  条件、赋值和定义
            5.4.4  运行求值器
        5.5  编译
            5.5.1  编译器的结构
            5.5.2  编译表达式
            5.5.3  编译组合式
            5.5.4  组合指令序列
            5.5.5  编译代码的一个实例
            5.5.6  词法寻址
            5.5.7  将编译代码与求值器连接

    References

    练习列表

    索引