SICP读书笔记 2.1
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的更多相关文章
- 【SICP读书笔记(一)】正则序展开的特殊情况
scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值. 第二种是正则序,会“完全展开然后归约”(书中原文) SICP中的练习1.5,让我困惑了一下.原题如下 ...
- SICP读书笔记 1.1
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 3.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 3.4
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 3.2
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 3.3
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 3.1
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 2.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 2.4
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- SICP读书笔记 2.3
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
随机推荐
- Hive学习之路 (十五)Hive分析窗口函数(三) CUME_DIST和PERCENT_RANK
这两个序列分析函数不是很常用,这里也练习一下. 数据准备 数据格式 cookie3.txt d1,user1, d1,user2, d1,user3, d2,user4, d2,user5, 创建表 ...
- js中使用trim
function trim(s) { return trimRight(trimLeft(s)); } //去掉左边的空白 function trimLeft(s) { if (s == null) ...
- Python自动化之跨域访问jsonp
这里提到了JSONP,那有人就问了,它同JSON有什么区别不同和区别呢,接下我们就来看看,百度百科有以下说明: ''' 1. JSON(JavaScript Object Notation) 是一种轻 ...
- 初识Qt布局管理器
Qt布局管理器的类有4种,它们分别为QHBoxLayout.QVBoxLayout.QGridLayout和QStackLayout.其中,QHBoxLayout实现水平布局,QVBoxLayout实 ...
- PAT乙级1021
1021 个位数统计 (15 分) 给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1& ...
- 如何解决安卓(系统版本低) CSS3 动画问题---高性能动画
目前对提升移动端CSS3动画体验的主要方法有几点: 尽可能多的利用硬件能力,如使用3D变形来开启GPU加速 -webkit-transform: translate3d(0, 0, 0); -moz- ...
- JFinal文件下载及设置路径
一:利用超链接 <a href="/download/a.docx">download</a> 二:java代码 1.页面 <a href=" ...
- css布局中关于 块状元素和行内元素的区分
这两天在准备实习的面试和笔试,准备复习一下这些基础的概念,避免自己处于一种仅脑袋理解嘴巴不能表述出来的状态. 块状元素和行内元素的概念是在css页面布局这个地方出现.主要是将html标签按照一定的特性 ...
- 404 Note Found 队- BETA 版冲刺前准备
目录 过去存在的问题 任务分工 规范 后端总结 卉卉 家灿 前端总结 绪佩 青元 恺琳 宇恒 丹丹 算法&API接口 家伟 鸿杰 一好 文档&博客撰写 政演 产品功能 我们已经坐了哪些 ...
- 搜集到的一些python资料
1,MOOC课程-Python语言程序设计(嵩天)http://www.icourse163.org/course/BIT-268001 2,Python123网站(嵩天老师的教学网站):https: ...