0
点赞
收藏
分享

微信扫一扫

1138_SICP学习笔记_软件抽象以及lisp简介

elvinyang 2022-02-10 阅读 63

全部学习汇总:GitHub - GreyZhang/g_SICP: learn SICP and hack lisp.

这里介绍了3种思维的模式:

1. 把多个简单的概念聚合成为一个复杂的概念;

2. 把两个概念,无论是简单的还是复杂的,放在一起,把它们相互联系起来,使它们同时得到看法,而不把它们结合在一起,从而得到它所有的关系概念。

3. 把它们与伴随它们的真实存在的一切其他的观念分开,这叫做抽象,因而它的一切一般的观念便形成了。

这个,算是我第一次在软件的著作中明白了什么叫做抽象的一个参考依据了。

这种说法很有意思,也难怪SICP的视频课程中的开场画面是一个魔法师。软件工程师需要寻找工作之中的乐趣,而作为魔法师的我们最大的乐趣其实就是召唤计算机的灵魂。

    从这里的描述看,早期lisp发明的时候主要的使用场景考虑的就是递归演算。这样就容易理解为什么SICP的视频课程里面老师写了那么多的递归处理的程序了。另外一点,lisp最初的设计很大程度是考虑符号运算的应用的。通过这里的描述,符号运算看起来很可能就是代数类的运算。

    Lisp最典型的一个优点是可以把程序当做数据来处理。前面我已经看过部分代码,返回一个函数的方式是不是就是其中的一个代表?如果是这样,那么其实类的处理方式python中应该也是有的。

    这里的三个主要的机制:原语的表达能力、组合方式、抽象方式。似乎可以结合最前面的思维方式来做一个思考。如果具备了这3种基本的机制,完成思维概念的所有的基本模式就还欠缺一个关系的处理了。

    从这个描述看,组合其实就是把几个不同的元素放在一起产生某种作用。或者说,组合其实就是形成复合表达式的过程。

    这是简单的命名方式,其实是一个变量定义的方式。但是,不像C语言的标识符的定义规定必须是数字字母下划线的组合且不可以数字开头那么明确,这里没有给出这方面的说明。我之前接触过emacs lisp自己部分common lisp,似乎也没有看到这方面明确的解释。但是,考虑大一统的原则,直接采用C语言的命名方式其实问题也就不大了。

    有些对象的信息其实是很复杂的,在进行解析的时候有时候很难把所有的细节全都记住。这种定义表述的方式其实让整个程序逐步构建成为可能,在构建的过程中我们可以通过继承的方式逐渐增加对象的信息。这样不仅简化了每一个阶段设计的困难,也增加了测试等方面的便捷性。

    什么叫做环境呢?其实就是解析器用来保存运行状态信息的存储。

    P14,这一点的确是我之前没有考虑过的。define的行为的确是跟一般的函数不同,因为一般的函数接收的是参数,进而根据参数进行相应的处理。而define完成是绑定,在执行的时候相应的参数其实还并没有存在于解析环境当中。恰恰是define把这个对象引入到了解析环境当中。

    P16,这个是函数的定义方式。其实,后面看了lambda之后,多少有点更加喜欢lambda的模式了。

    P19,从这段描述看,言外之意是解析器其实采用的并不是替代模型的处理方式。而后面的章节,第3章和第4章会有关于解析器的实现研究。这部分还是很让人期待的。

    P20,这里提到的两种模式其实是很容易做一个总结来对比的。前面看到的那种模型的方式是:只要是能够求解就求解。后面看到的模型的方式则是能不求解就不求解,等到最后。

    这里给出了两种求值方式的名字,一个是应用顺序的求值,另一个则是按照应用顺序的求值。lisp中主要采用正常顺序求值,可以避免一部分多次求值的产生,提升效率。

举报

相关推荐

0 条评论