SICP CONCLUSION

让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 !

祝我能够突破层层代码,找到住在里计算机的神灵!

目录

1. 构造过程抽象
2. 构造数据抽象
3. 模块化、对象和状态
4. 元语言抽象
5. 寄存器机器里的计算

Chapter 2

  • 构造数据对象
练习答案

数据抽象引导

为什么程序需要复合数据?

  • 与我们需要复合过程一样:同样是为了提升我们子设计程序时所位于的概念层次,提高设计的模块性,增强语言的表达能力

数据抽象

  • 将那些如何处理数据的部分和数据如何表示分离

怎么去屏蔽数据的表示细节,从而实现更通用的操作呢?

(define (linear-combination a b x y)
(+ (* a x) (* b y))) (define (linear-combination a b x y)
(add (mul a x) (mul b y)))

什么是数据?

组成复合数据的关键思想

  • 在进行过程抽象时,我们隐藏了具体过程的实现细节,这个特定过程完全可以由另一个具有同样整体行为的过程取代,换句话说,我们可以这样造成一个抽象,它将这一过程的使用方式,与该过程究竟如何通过更基本的过程实现的具体细节分离

  • 而数据抽象也同理,也是屏蔽了具体实现和操作它分离,提供的抽象屏障应该是一组选择函数和构造函数

1.1 实例:有理数的算术运算

按愿望思维,假设我们已经有了一组有理数的选择函数和构造函数

(define (add-rat x y)
(make-rat (+ (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (denom y)))) (define (sub-rat x y)
(make-rat (- (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (denom y)))) (define (mul-rat x y)
(make-rat (* (numer x) (numer y))
(* (denom x) (denom y)))) (define (div-rat x y)
(make-rat (* (numer x) (denom y))
(* (denom x) (numer y)))) (define (equal-rat? x y)
(= (* (numer x) (denom y))
(* (numer y) (denom x))))

有理数的表示

接下来就应该是具体实现有理数的表示,而Scheme给我们提供构造复合数据的工具则是cons

(define (make-rat n d) (cons n d))

(define (numer x) (car x))

(define (denom x) (cdr x))

;;footnote -- alternative definitions
(define make-rat cons)
(define numer car)
(define denom cdr) (define (print-rat x)
(newline)
(display (numer x))
(display "/")
(display (denom x)))

1.2 抽象屏障

有关这个有理数实例的抽象层次,先是有理数的具体实现,到它的选择和构造函数,有理数的操作方法,到使用有理数的程序

把程序各个部分分成不同部分,并且把依赖性限制到少数的几个抽象屏障中,易维护,易修改,且灵活

1.3 数据意味着什么?

如果说是它由给定的选择函数和构造函数实现的东西,那么显然是不够的

书上给出一种解释,我们总可以把数据定义为一组适当的选择函数和构造函数,以及为这些过程是合法表示所需要满足的特特定条件

如果说这就是数据,那么是不是可以说在程序设计中处处都是数据呢?比如cons也是?

(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "Argument not 0 or 1 -- CONS" m))))
dispatch) (define (car z) (z 0)) (define (cdr z) (z 1))

这小节的练习里主要还是锻炼数据抽象和完善它的能力

这一节里主要讲的还是怎样通过给出一组选择函数和构造函数去构建数据抽象,并且通过一层一层的抽象屏障,把程序的各个部分的依赖性降到最低,或许就是低耦合吧。再接着比较打破观念的就是数据究竟是什么?书上给出一种解释,我们总可以把数据定义为一组适当的选择函数和构造函数,以及为这些过程是合法表示所需要满足的特特定条件

SICP读书笔记 2.1的更多相关文章

  1. 【SICP读书笔记(一)】正则序展开的特殊情况

    scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值. 第二种是正则序,会“完全展开然后归约”(书中原文) SICP中的练习1.5,让我困惑了一下.原题如下 ...

  2. SICP读书笔记 1.1

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  3. SICP读书笔记 3.5

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  4. SICP读书笔记 3.4

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  5. SICP读书笔记 3.2

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  6. SICP读书笔记 3.3

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  7. SICP读书笔记 3.1

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  8. SICP读书笔记 2.5

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  9. SICP读书笔记 2.4

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  10. SICP读书笔记 2.3

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

随机推荐

  1. BZOJ 2424 订货 最小费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2424 题目大意: 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的 ...

  2. 操作系统的三个接口 shell gui api

    操作系统的三个接口 shell gui api 编程语言是用来告诉操作系统干什么的语言. 编程语言是人机交互语言. 程序.进程:任务集.

  3. URL地址理解

    / 表示相对目录的根目录./ 表示相对目录的本层目录../ 表示相对目录的上层目录

  4. Java常用的快捷键

    // // (1)Ctrl+Space // 说明:内容助理.提供对方法,变量,参数,javadoc等得提示, // 应运在多种场合,总之需要提示的时候可先按此快捷键. // 注:避免输入法的切换设置 ...

  5. 【转】打包2个10g文件 测试

    微博上kevin_prajna提了一个问题:“求Linux下一打包工具,需求:能把两个10G的文件打包成一个文件,时间在1分钟之内能接受!”. 暂且作答一下吧.首先问题是求解工具,那么我们忽略IO问题 ...

  6. [转]C#调用C++类(以COM组件的形式)

    如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组 ...

  7. java基础二 java的跨平台特性

    一:java跨平台的特性: 1.生成不平台无关系的字节码. 2.通过和平台有关的jvm即java虚拟机来执行字节码.jvm不跨平台. 图示: 疑问:1.为什么我们不直接写字节码? 因为字节码只有jvm ...

  8. 703. Kth Largest Element in a Stream

    题目来源: https://leetcode.com/problems/kth-largest-element-in-a-stream/ 自我感觉难度/真实难度: 题意: 这个题目的意思解读了半天,没 ...

  9. .Net实现Word文档及导出

    参考网址: http://www.jb51.net/article/25062.htm(实用性) http://wenku.baidu.com/link?url=44O7Dua49DrZ-PF2QU7 ...

  10. Verilog基础知识0(`define、parameter、localparam三者的区别及举例)

    1.概述 `define:作用 -> 常用于定义常量可以跨模块.跨文件; 范围 -> 整个工程; parameter:     作用 -> 常用于模块间参数传递; 范围 ->  ...