2008-03-20
SICP学习笔记之一
1. 目的
本文档为SICP学习笔记。
SICP,是“Structure and Interpretation of Computer Programs”的缩写,中文译名为“计算机程序的构造和解释”。SICP初版于1984年,1996年发行第二版。本书是麻省理工学院(MIT)计算机科学的入门教材(对应着大名鼎鼎的MIT课程 6.001),斯坦福、牛津、东京大学等世界100多所大学也用SICP作教材。
可以在网站上 http://mitpress.mit.edu/sicp/ 上获取此书的相关信息。
要解释清楚什么是计算机科学(Computer Science,简称 CS),即便是资深的业内人士,也往往会觉得无从说起。其实CS本身是一门充满了挑战、而又趣味盎然的学科。从看起来吓煞人的SICP着手,反而能很快体会到这种趣味。
2. Scheme入门
2.1 准备工具
SICP很明智地选择了Lisp。对于一个新手来说,C/C++、Java、Python、Ruby等等众多带有工程味道的语言,任何一门就足以让人望而却步。吭哧吭哧学会了某种语言,突然发觉要用这门语言来做点正事仍然是茫然无措。
Lisp像围棋,易学难精,对于初学者和大师,都觉得变化无穷。Lisp有很多种方言,不用解释什么,先去下载一个DrScheme吧,http://www.drscheme.org/,安装并运行,就像下面这个样子,很简单吧。
2.2 轻松上手
学习Scheme很容易,需要注意以下几点就可以了。
第一,Scheme采用了所谓的“前缀表示”。刚开始不习惯,时间长了就觉得很美。看几个例子:
相信看明白了吧,(+ 2 3) 代表 2 + 3,(+ 2 3 4) 代表 2 + 3 + 4,优点也能看出一点了,三个数相加只用了一个“+”,就算有1万个数相加,也只有一个“+”。
第二,用括号来区分表达式。括号后面的第一个符号,代表了某种运算或者行为,后面的符号,代表了运算或行为涉及的对象。还是看几个例子。
第三,表达式可以嵌套。这个也不复杂,看例子。
第四,命名。前面都是针对具体的数进行操作,通过define,可以定义变量,有了变量,才有程序开发。还是看例子。
看起来也很简单,定义了一个变量,名字是“two”,与数字“2”关联。
2.3 定义过程
这一步是魔幻世界的入口,需要仔细体会。明白了过程的定义,Scheme这门语言也就基本上搞定了。还是直接看例子。
这就是一个完整的过程定义,先看看会得到什么结果。
基本上清楚了,(define (square x) (* x x)) 定义了一个过程,这个过程的作用是计算某个数的平方。将定义拆分开,仔细看一下,包括了两个表达式。
(square x)表明了这个过程的名字是“square”,这个过程需要一个参数。
(* x x)这是过程的真正定义,表明了把参数乘以自身,也就是参数的平方。
所有的过程,都是这么定义的,在过程中可以引用已经定义好的过程。看这个例子。
根据上面的说明,此表达式定义了一个过程,名字叫做“triple”,有一个输入参数,这个过程,是把这个输入参数乘以(square x),根据前面的定义,“square”是把这个参数平方,因此可以知道过程“triple”是把这个参数立方。验证一下。
本文档为SICP学习笔记。
SICP,是“Structure and Interpretation of Computer Programs”的缩写,中文译名为“计算机程序的构造和解释”。SICP初版于1984年,1996年发行第二版。本书是麻省理工学院(MIT)计算机科学的入门教材(对应着大名鼎鼎的MIT课程 6.001),斯坦福、牛津、东京大学等世界100多所大学也用SICP作教材。
可以在网站上 http://mitpress.mit.edu/sicp/ 上获取此书的相关信息。
要解释清楚什么是计算机科学(Computer Science,简称 CS),即便是资深的业内人士,也往往会觉得无从说起。其实CS本身是一门充满了挑战、而又趣味盎然的学科。从看起来吓煞人的SICP着手,反而能很快体会到这种趣味。
2. Scheme入门
2.1 准备工具
SICP很明智地选择了Lisp。对于一个新手来说,C/C++、Java、Python、Ruby等等众多带有工程味道的语言,任何一门就足以让人望而却步。吭哧吭哧学会了某种语言,突然发觉要用这门语言来做点正事仍然是茫然无措。
Lisp像围棋,易学难精,对于初学者和大师,都觉得变化无穷。Lisp有很多种方言,不用解释什么,先去下载一个DrScheme吧,http://www.drscheme.org/,安装并运行,就像下面这个样子,很简单吧。
2.2 轻松上手
学习Scheme很容易,需要注意以下几点就可以了。
第一,Scheme采用了所谓的“前缀表示”。刚开始不习惯,时间长了就觉得很美。看几个例子:
(+ 2 3) 5 (+ 2 3 4) 9
相信看明白了吧,(+ 2 3) 代表 2 + 3,(+ 2 3 4) 代表 2 + 3 + 4,优点也能看出一点了,三个数相加只用了一个“+”,就算有1万个数相加,也只有一个“+”。
第二,用括号来区分表达式。括号后面的第一个符号,代表了某种运算或者行为,后面的符号,代表了运算或行为涉及的对象。还是看几个例子。
(* 2 3) 6 (/ 10 2) 5
第三,表达式可以嵌套。这个也不复杂,看例子。
(+ (* 3
(+ (* 2 4)
(+ 3 5)))
(+ (- 10 7)
6))
57
第四,命名。前面都是针对具体的数进行操作,通过define,可以定义变量,有了变量,才有程序开发。还是看例子。
(define two 2) 2 (* 10 two) 20
看起来也很简单,定义了一个变量,名字是“two”,与数字“2”关联。
2.3 定义过程
这一步是魔幻世界的入口,需要仔细体会。明白了过程的定义,Scheme这门语言也就基本上搞定了。还是直接看例子。
(define (square x) (* x x))
这就是一个完整的过程定义,先看看会得到什么结果。
(square 5) 25 (square 1.5) 2.25
基本上清楚了,(define (square x) (* x x)) 定义了一个过程,这个过程的作用是计算某个数的平方。将定义拆分开,仔细看一下,包括了两个表达式。
(square x)表明了这个过程的名字是“square”,这个过程需要一个参数。
(* x x)这是过程的真正定义,表明了把参数乘以自身,也就是参数的平方。
所有的过程,都是这么定义的,在过程中可以引用已经定义好的过程。看这个例子。
(define (triple x) (* x (square x)))
根据上面的说明,此表达式定义了一个过程,名字叫做“triple”,有一个输入参数,这个过程,是把这个输入参数乘以(square x),根据前面的定义,“square”是把这个参数平方,因此可以知道过程“triple”是把这个参数立方。验证一下。
(triple 5) 125 (triple 1.5) 3.375
评论
wainwen
2008-03-22
写读书笔记的目的,是想让公司的开发人员换一换脑筋,让非开发人员、但是对开发感兴趣的同事了解一些计算机科学的常识
用SICP来做科普,有点出乎意料地合适,真的是大道至简。很肤浅地学过一些语言,暗地里觉得Perl、Ruby有点变态,Java笨拙,C++繁琐,更喜欢C和Lisp,可惜现在要想靠喜欢的东西混饭吃,那是越来越难了哦
为了让没有编码经验的市场和客服人员也能大概看明白,行文力求简单粗俗。所谓读书笔记,也不依照原文章节,基本上是写什么算什么,就不发到龙蛇混杂的论坛去找骂了^_^
用SICP来做科普,有点出乎意料地合适,真的是大道至简。很肤浅地学过一些语言,暗地里觉得Perl、Ruby有点变态,Java笨拙,C++繁琐,更喜欢C和Lisp,可惜现在要想靠喜欢的东西混饭吃,那是越来越难了哦
为了让没有编码经验的市场和客服人员也能大概看明白,行文力求简单粗俗。所谓读书笔记,也不依照原文章节,基本上是写什么算什么,就不发到龙蛇混杂的论坛去找骂了^_^
发表评论
- 浏览: 72221 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最新评论
-
德鲁克日志读后感之四十八
"救.命"也是非法词汇了,只能中间加点
-- by wainwen -
德鲁克日志读后感之四十三
引用“我的责任是什么”、“我应该做出什么贡献”、“我做出了什么贡献”看这篇文章的 ...
-- by bybsky -
德鲁克日志读后感之四十
从旁观者的角度看问题,就是暂时摆脱自己的利益关系,只从事情本身的对错、优劣去判断 ...
-- by Qieqie -
德鲁克日志读后感之四十一
"自由是一种有责任的选择。" ========================= ...
-- by Qieqie -
德鲁克日志读后感之三十九
C3PO 写道你这“德鲁克”发了三十几篇,每篇都没人回,点击率不超过100,你不 ...
-- by maxiaoxia






评论排行榜