《计算机程序的构造和解释》这本书的目的不是要解释的编程语言的语法,它是一种。

不是在你的语句知识,但是,你要教的东西做什么。

这是一个过程,一个精神。

就是所谓的程序规则的模式。

书中用了很多的样例来诠释书名,我才疏学浅就不再举例往博客上推了。只归纳一点总结而已。

假设说程序是一种法术,那么控制奇妙的法术就是过程。

因此我们须要一门叫做Lisp的语言来唤醒这样的精神。从书中的解说中我们发现,Lisp语言的语法并不多,要记住这些语法并不难,但要理解这些规则的含义以及怎样使用这些规则,则是要上非常长的时间去修炼。深入理解了这些规则便会使你成为更优秀的程序猿。

在计算机科学中,这并非要告诉人们该怎样算平方根,作者也说了假设这是计算机科学的所有。那么便没什么了不起的。真正的问题是。当我们试图建立非常大的系统时,这一般是几千页长的计算机程序。

之所以能完毕这样的庞大的project,是由于有一些技术,用于控制这些大型系统的复杂性。而假设控制复杂性也是这门课的重点,某种意义上来说,这也解释了什么是真正的计算机科学。

作者举了一个样例,当一名project师正在设计一个由非常多实体构成的物理系统时。操心这个系统的project师不得不去解决容许误差和噪音的问题。而我是一个电气project师,我能够去非常easy的建立起一级或二级的放大器。你也能够设想建造一百万个放大器的级联。可是去建造这样一种东西是非常荒唐的事情,由于在建造这一百万个放大器的非常长时间之前,这些组件的噪音会得到放大。以至于这整个project没有了意义。

计算机科学负责处理理想化的组件,我们非常清楚的知道我们在将这些小程序和数据块放到一起。我们不必操心误差。那意味着在建立一个庞大的程序时。这和我能建立和我能想象的没有什么不同。

由于这些部分是我知道我想要的抽象的实体。

非常显然project师是非常准确的,因此相对于其它类型的project。你能够建立约束物理系统的限制,建立噪音和近视的限制,实行建设大型软件系统的限制是我们的思想局限。所以从这一点来看,计算机科学就像是project的一个抽象形式。用在所有的project中的一种技术,叫做黑盒抽象。

假设说求出X的平方根可能是一个复杂的整体的一套规则,那么终于会有,比方36的平方根,得出6。而真正重要的是。假设我想计算A的平方根加上B的平方根。那么你便能够用这个规则,而且将其看作一个无需知道内容的模块。由于从我们的角度来看。黑箱内有什么并不重要,由于我们不过想要知道他们的平方根的和。

这在C等各种语言中都有体现。比方给一个函数传入一个參数。我们并不须要知道这个函数的具体操作,不过须要它们的代码。当然了。这里所说的函数是别人写好的库。

书中有一个求平方根的样例。为了去做些什么,我们须要去做一个猜想,而且不断的去改进它。

这里我们能够做一个黑盒,上面写着“平方根”。这里是一个过程,它本身就是关于通用的战略的整体战略第一个关键——将黑盒抽象。将原始的程序和原始的数据结合起来作出更复杂的事情,这里就是说的组合。这是通过定义程序和处理数据抽象的复合数据的技术来完毕。我们要用到的是一种叫做高阶函数的东西,它的输出和输出都是自己的程序。

假设用1和3乘以2,将会得到8。但当我们考虑所谓的线性组合的整体思路时,便能够非常easy的加入两件事情和别的东西相乘。

比如将向量a1和向量a2。通过一些因子来扩展它们,而且得到还有一个向量。我们也能够考虑有两个多项式A1和A2,可能会用2或者其它的数值来乘以这两个多项式。又或者A1和A2可能是电信号。我们可能须要组合这两个电信号而且将其放大。

这就是前面所说的通用的战略的整体战略的第二个关键——常规接口。要做到控制复杂性。就须要建立常规的接口。将约定的东西放到一起。当在谈论真正的大尺度结构时,常规接口在现世界中建模赋值的系统时非常重要。这样的系统有两个非常重要的隐喻,一个被称为OOP(面向对象编程),将我们的系统分为很多小东西。它们之间发送信息交互。还有一个称为流。在那里我们就像电气project师将拼起电气系统一样拼起大型系统。

第三个关键则是基于技术控制的复杂性来构造新的语言——也就是书中第四章所说的元语言。由于当面临一个不堪重负的复杂设计时,也许选择一个新的设计语言是控制这样的复杂性的非常好方式。而新设计语言的目的是突出了系统的不同方面,它能够一直某些类型的细节,而强调其它种类的具体信息。这是这本书最奇妙的部分,而建立新语言的第一步就是用Lisp过程来解释Lisp自身。也许更加神奇的则是仿佛Lisp有两个巨大的车轮——应用和循环。在书中封面你将会看到,它们各自是apply和eval。在我们后面的学习过程中将学习元语言抽象,这将帮助我们构建新的语言。所谓的逻辑编程语言。就是你并不须要研究输入输出的过程。须要研究的则是它们之间的关系。

在第一章我觉得非常重要的一点是lambda和define之间的关系。这在第41页中有具体描写叙述。

(define (plus4 x) (+ x 4))

等价于

(define plus4 (lambda (x) (+ x 4)))

要时刻记住这一点,由于在后面的复杂的程序中。会有非常多个define出现。并唯独

(define (plus x) (+ x 4))

也有

(define plus (+ 4 4))

理解下面这两段代码非常有必要。

(define A
(* 5 5))
(define (D)
(* 5 5))

在这里。

A-->25
D-->compound procedure
(D)-->25
(A)-->error
(define A
(* 5 5))
;Value: a A
;Value: 25 (A)
;The object 25 is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
;Start debugger? (y or n): n (define (D)
(* 5 5))
;Value: d D
;Value 12: #[compound-procedure 12 d] (D)
;Value: 25

程序猿通过构造程序和表达式来构建一个法术,而这些法术在某种程度上直接通过一个过程来实现这一目标。为了有效的做到这一点,我们必须要明确所写的特定事物之间的关系,这些特定的咒语,还有我们试图控制的过程的行为。

在这里我们有lambda,有definitions,有conditionals。还有combinations。怎样去求值组合呢?但真正须要组合起符号和数字的时候,数字会对自身求值,而在代换模型中符号将会消失不见。

它们不会出现,直至你须要它们。怎样来看求值一个应用程序的规则呢,当求值一个组合的时候,它有几个部分——运算符和操作数。运算符会返回到程序。假设求值运算符。我们就会得到一个过程,比方+运算符。替代过程的形式參数提供的參数,形式參数在过程的声明中得到定义。这样我们就能够来求值一个新的实体,这个实体通过用代换模型来复制旧的实体。

即便是对于简单的加法乘法,不管你深入到怎样的细节中去,在一台机器中,你都会发现有更深入的细节。因此我们要学会的便是忽视细节,理解复杂问题的关键是知道什么不用看、什么不用计算还有什么不用考虑。书中关于假设通过代换模型来计算3和4的乘积和已经非常完美了,通过这个样例我们已经看到代换模型的规则,那就是当求值运算符时会得到一个过程,当求值操作数时。假设还没有做应用。则不过得到一个參数。也就是说对于(* 3 (+ 1 4)),(+ 1 4)就相当于是乘法运算符的操作数,在对其求值的时候,假设还没有得到应用,其不过乘法运算符的參数而已。

而对于应用这个词。应用序和正则序则是非常重要的概念。

通过代换模型去命名这些事物以及这些表达式。Gerald Jay Sussman教授说,每个巫师都会告诉你,假设你有命名的精神,你就有了权力。



感谢訪问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问。转载请注明出处:

http://blog.csdn.net/nomasp


版权声明:本文 NoMasp王克在 原创文章,如需转载,请与我联系。

分享智慧,维护知识产权。

【SICP感应】1 工艺和替代模式的更多相关文章

  1. 【SICP感应】3 级数据和符号数据

    在本书的第二章学习时,有一个问题我一直很困扰,那是2.2.4举例节.因为没有华丽的输出模式书,它只能有一个对的英文字母.两三个月的这浅浅的学校前Common Lisp同样是真实的,当.了非常赞的线条, ...

  2. Lisp和SICP

         大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒.      几个月前,几天内攻城略地搞定了Python,用的方法便是 ...

  3. BZOJ 2882: 工艺

    2882: 工艺 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 599  Solved: 268[Submit][Status][Discuss] D ...

  4. cocos2dx 3.x(让精灵随着重力感应的方向移动而移动)

    // // GameScene.hpp // HelloWord // // Created by apple on 2017/1/7. // // #ifndef GameScene_hpp #de ...

  5. javascript检查移动设备是否支持重力方向感应

    javascript如何检查移动设备,如手机平台是否支持重力或者方向感应. 可以使用html5提供的重力和方向感应接口来判断. html5 中针对高端手机提供了重力感应和重力加速的接口,开发可以利用这 ...

  6. SICP— 第一章 构造过程抽象

    SICP  Structure And Interpretation Of Computer Programs 中文第2版 分两部分  S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过 ...

  7. H5案例分享:html5重力感应事件

    html5重力感应事件 一.手机重力感应图形分析 1.设备围绕z轴的旋转角度为α,α角度的取值范围在[0,360). 设备在初始位置,与地球(XYZ)和身体(XYZ)某个位置对齐. 设备围绕z轴的旋转 ...

  8. 《SICP》读后感:关于软件本质的一点思考

    摘要:软件本身不是目的,人类的需求才是目的,而软件只是达到目的的手段. 软件的本质在于控制复杂性,这个复杂性并非来自于计算机,也并非来自于现实世界,而是来自于人类的思维和知识体系. 软件被使用的广泛性 ...

  9. Corel Painter 15在Surface Pro 4下开启笔触压力感应

    之前一直是用Wacom的板子,所以只需要下载Wacom板子相应的驱动安装即可就能在PS和Corel Painter中开启压力感应来调节笔触出线的粗细.Surface Pro 4的笔是支持压力感应的,但 ...

随机推荐

  1. LeetCode——Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  2. Androidproject夹

    创建一个Android应用 File -> New -> Android Application Project 填写应用名称.project名称.包名 设置project的相关信息.默认 ...

  3. UpdataData

    MFC中有一个UpdataData函数,有二个参数:TRUE和FLASE,二个参数什么时候用, 开始的时候我也迷糊,后来才发现: UpdataData(TRUE):是把控件上的值刷新到变量中: Upd ...

  4. 欧拉计划&#183;第四题

    题目4:找出由两个三位数乘积构成的回文. 一个回文数指的是从左向右和从右向左读都一样的数字.最大的由两个两位数乘积构成的回文数是9009 = 91 * 99. 找出最大的有由个三位数乘积构成的回文数. ...

  5. Storyboard 经常用法总结-精华版

    1.prepareForSegue: Now we know what the destinationViewController is we can set its data properties. ...

  6. c++重载ostream的实现

    #include <iostream> using namespace std; class Point{ public: Point(int _x = 0, int _y = 0, in ...

  7. 高效合并两个有序数组(Merge Sorted Array)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...

  8. ExtJS4.2学习(7)——基础知识之Reader&Writer篇

    Reader: 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据保存到Modle中. 结构图 Ext.data.reader.Reader 读取器的根类(很少直接实例化这个 ...

  9. windows 7多点触摸开发

    win7 触摸屏系统应用广泛,软件操作方便,功能强大,现以被很多硬件厂商应用. 我曾用一台装有win7 的汉王平板电脑进行了多点触摸软件的开发.      开发环境及条件: 1. 平板电脑+ win7 ...

  10. java自己主动打开包装盒很容易导致两个误区

    从J2SE 5.0开始提供基本数据类型的自己主动装箱(autoboxing).拆箱(unboxing)功能. 何为自己主动装箱: 当我们创建一个Integer对象时,却能够这样: Integer i ...