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

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

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

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

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

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

因此我们须要一门叫做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. 在HTML中如何隐藏某段文字具体该怎么实现

    <p style="display:none;"> 需要隐藏的文字....... </p> <div style="display:none ...

  2. 浅谈Jquery的使用上篇

    一. 1.Jquery是什么?有什么特性? jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取.HTML 元素操作. CSS 操作 .HTML 事 ...

  3. hdu1217Arbitrage--解题报告

    题意:套利,一个US币换取0.5 British pound,而1 British pound 换取10.0 French francs,同一时候 1 French franc buys 0.21 U ...

  4. JAVA进阶----ThreadPoolExecutor机制(转)

    ThreadPoolExecutor机制 一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程 ...

  5. SICP 解题集 — SICP 解题集

    SICP 解题集 — SICP 解题集 SICP 解题集¶ 这个文档的目标是成为中文化的.完整的<计算机程序的构造和解释>一书的解题集. 这个解题集的特色是: 对于每道习题,除了习题答案之 ...

  6. 轻松学习之Linux教程一 ubuntu14.04+windows双系统安装

    本系列文章由@uid=hpw" style="color:rgb(255,0,0)">超人爱因斯坦出品.转载请注明出处.          文章链接:http:// ...

  7. oschina 手机/移动开发

    手机/移动开发 Android UI 组件(167) React Native 相关(8) 网站客户端(16) NativeScript 插件(18) iPhone/iPad开发工具(16) WP7开 ...

  8. 那些年踩过的坑之:first-child伪类选择器

    原文:那些年踩过的坑之:first-child伪类选择器 :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w3school 嗯,乍一看好像说的不是很明白,因此这个选择 ...

  9. CC ANUMLA(STL的运用)

    题目连接:http://www.codechef.com/problems/ANUMLA 题意:给一个序列所有子集和(2^n个子集),复原这个序列... 如:0 1 1 2 2 3 3 4 原序列为1 ...

  10. 恩布企业 IM 安卓端 1.3,服务端 1.12 公布

    恩布企业IM的 Android 安卓开源手机client EntboostIM 公布 1.3 版本号.同一时候恩布IM服务端更新至 1.12 版本号; 安卓端主要更新内容: 添加收发手机文件功能: 登 ...