lisp
Lec1a
- 编程就像念咒语
- 从另外一个角度看computer science
computer science是一个糟糕的名字.这门学科中所包括的不仅仅是computer,并且它也并不是科学,而更接近于tech or engineering.
geometry,几何学,名字来源于gaia meaning to earth,and metron meaning to measure.埃及祭司用来计算每年被尼罗河摧毁的土地边界,从而创立了几何学.对于他们来说,geometry确实是用来测量土地.但几何学本身的内容早就已经超出了最开始的范围.
cs也是这样.它不仅仅是介绍计算机使用.
但是回过头看千年前埃及人的工作,他们开始形式化地对空间与时间进行描述.并且归纳出了一套讨论数学真理的形式化方法.这直接导致了公理化方法,促进了现代数学的诞生,指明了一种精确讨论何为真理的方法.
同样的,千年之后的人类回头看我们现在的cs,会作何评价?我们只是摆弄着一个叫做计算机的小玩意,但却真正意义上开始了对于计算过程的形式化表示,并结合实际需求,发展出一套问题处理过程精确描述的方法.
下面来举个栗子:
我们都知道平方根的定义:
$\sqrt{x}$是满足$y^2=x$同时$y≥0$
这个定义告诉了你平方根是什么,却没有告诉你如何求一个平方根。
这里提供亚历山大Heron提出的一叫连续取均值求平方根法。下面列出形式化的描述:
如何求$\sqrt{x}$的平方根?
1.随便猜一个数叫$G$
2.改进你的猜想通过计算 $G$ 和 $X/G$的平均值
3.不断重复步骤2,直到满意为止
对于cs来说,我们要完成的是拥有一个定义之后,实现它的具体而精确的计算过程.
Lec2b
- 数据抽象 data abstraction
用构造函数与选择函数来分隔 数据的表示与数据的使用
例如构建一段关于点,线的代码段
从层次结构上看,分成了三层
segments
make-seg seg-start seg-end (构造函数与选择函数)
vectors
make-vertor xcor ycor (构造函数与选择函数)
pairs - 重要的不是某个小功能的本身,而是我能够用这个小block来搭建什么
- 模糊数据与过程的边界是有利的.
Lec3a
- 封闭性(closure)是一个非常良好的特性.在缺少封闭性的语言中,你可以使用字符串,数字等去构造数组.但不能用数组去构造数组.
例如用cons去构建cons1
2
3cons(1
cons(1 2)) - regard the procedure and data as the same thing
- 当你有一项任务要完成时候,有两种情况
你把它分解成为几个sub-tasks,再把sub-tasks分解成又几个sub-tasks,成为一个树的形状.
或者,选择使用层级结构.在每个层级只讨论描述该层级的事件,从而实现良好的分层.
层级结构与书级结构的差距在于:层级是为了讨论整个事件,而树形只是为了解决这个具体的问题.原因在于,对于相似的事件,他们有相似的层级结构,但在树形上,因为处理到的具体细节的不同,存在较大的差距.
层级具有更好的robust,当你做出某些改变时,会做出相应的回应.想要改变某层的效果,只要去更改更底层的内容.
并且,在每一层都有完备的语言去描述具体的操作.因而,想要实现某些变化的时候,你可以选择在某个具体的层级改变.
这使得计算机科学比其他的工程学更加强大Lec3b