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

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

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

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

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

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

因此我们须要一门叫做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. ANDROID L——Material Design综合应用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Material Design: Material Design是Google推出的一个全 ...

  2. C#反射Assembly 具体说明

    1.对C#反射机制的理解 2.概念理解后,必须找到方法去完毕,给出管理的主要语法 3.终于给出有用的样例,反射出来dll中的方法 反射是一个程序集发现及执行的过程,通过反射能够得到*.exe或*.dl ...

  3. codeforces 659C Tanya and Toys

    题目链接:http://codeforces.com/problemset/problem/659/C 题意: n是已经有的数字,m是可用的最大数字和 要求选自己没有的数字,且这些数字的数字和不能超过 ...

  4. OpenCV HaarTraining代码解析(二)cvCreateMTStumpClassifier(建立决策树)

    HaarTraining关键的部分是建立基分类器classifier,OpenCV中所採用的是CART(决策树的一种):通过调用cvCreateMTStumpClassifier来完毕. 这里我讨论利 ...

  5. GitLab 5.3 升级注意事项

    最主要就是需要更新的Git.我的Ubuntu12.04通过apt-get install安装的git版本过低. 所以只能通过源代码安装. 参考下面的步骤: wget git-core.googleco ...

  6. Just learn how to use the JNI

    JNITestProject Just learn how to use the JNI Refer : 1. ant usage http://lmbj.net/blog/ant-build-and ...

  7. 方案猿身高project联赛,艺术家,相反,养殖场!-------三笔

    已经看到了程序猿在电影中都是非常厉害的人物,硬道理键盘噼里啪啦后,奇妙的事情会发生. 当我报了这个专业,開始认真的写程序,在这个领域学习的时候,却发现非常多干这一行 的都自称"码农" ...

  8. MFC模态对话框的消息循环

    MFC模态对话框的消息循环 单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作? 当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态 ...

  9. Android入门之简单短信发送器

    效果图: manifest.xml 文件中加入  <uses-permission android:name="android.permission.SEND_SMS"/&g ...

  10. 腾讯视频QLV格式转换mp4的方法

    腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...