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. 解决Struts2 json-plugin Date或Timestamp等日期格式带T的问题

    如果没有对日期时间对象类进行json日期格式声明,会出现类似"2013-06-18T12:08:56.23"日期,在日期中间多出一个T字母: 从通过查询数据,以及调试程序发现直到返 ...

  2. Spring-IOC bean 创建过程中的 ObjectFactory

    AbstractBeanFactory中doGetBean方法里有一段拿到RootBeanDefinition后,实例化该bean的方法 // Create bean instance. if (mb ...

  3. 4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  4. 【node.js】Express 框架

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网 ...

  5. centos中安装、升级git

    yum install git 若是从老版本升级,则按下面方法.(centos中) 先更新系统sudo yum update     安装依赖的包yum install curl-devel expa ...

  6. KMP算法用JavaScript实现

    KMP算法是字符串匹配的经典算法,简称 看毛片, 理论知识请直接看阮一峰老师的这篇文章,我看完文章之后尝试对算法进行了实现. 一句话总结KMP算法的核心思想:就是跳过已经对比的部分 而KMP算法的核心 ...

  7. 利用MATLAB软件对数码相机进行检校

    分享资料:https://pan.baidu.com/s/1FQb-ttLJNJKlMzu-0RjBsw.内部包含张正友的经典论文等文献,官网的checkerboardPattern等.

  8. $NOIp$前的日常

    嗯,一想到没准今年\(NOIp\)之后就要退役了,觉得没准这篇博客就是我OI史上的绝唱了-- \(hhh\),希望不会这样. \(12.4\) 退役了是真的233-- 居然感到一身轻松啊qwqwq \ ...

  9. Ext4文件系统架构分析(一)

    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...

  10. 测试oracle表空间自动扩展

    2019-04-1116:01:25 表空间分配10m自动扩展,向表中插入数据,看表空间达到10m以后是否会报错. 测试过程如下: 1.创建表空间 CREATE TABLESPACE TEST DAT ...