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去构建cons
    1
    2
    3
    cons(1
    cons(1 2))

  • regard the procedure and data as the same thing
  • 当你有一项任务要完成时候,有两种情况
    你把它分解成为几个sub-tasks,再把sub-tasks分解成又几个sub-tasks,成为一个树的形状.
    或者,选择使用层级结构.在每个层级只讨论描述该层级的事件,从而实现良好的分层.
    层级结构与书级结构的差距在于:层级是为了讨论整个事件,而树形只是为了解决这个具体的问题.原因在于,对于相似的事件,他们有相似的层级结构,但在树形上,因为处理到的具体细节的不同,存在较大的差距.
    层级具有更好的robust,当你做出某些改变时,会做出相应的回应.想要改变某层的效果,只要去更改更底层的内容.
    并且,在每一层都有完备的语言去描述具体的操作.因而,想要实现某些变化的时候,你可以选择在某个具体的层级改变.
    这使得计算机科学比其他的工程学更加强大

    Lec3b