关键字:scheme, interpreter, quote, pointer, stack, heap, activation record, continuation, call graph, compiler

    推荐:★★★★★
    难度:★★★★

    在线地址:http://www.cs.rpi.edu/academics/courses/fall00/ai/scheme/reference/schintro-v14/schintro_toc.html


    这是一本scheme的中级读物,
    深度适中,适合对scheme入门以后,想深入学习的读者。

    对比,
    Essentail of Programming language,
    Lisp in small pieces,
    跟这两本书深度相当。

    可以对比的还有,
    Compiling with continuation,
    Concepts in Programming Languages,

    这些书可以一起读,
    增加乐趣。

    本书读起来略显啰嗦,
    因为很多概念都用几段话重复描述,
    这也是读起来收获比较大的原因。

    很少有书,注意区分了标识符,变量,和绑定。
    很少有书,提到了scheme语言的变量都是指针,
    很少有书,提到了scheme的内存模型,对象都是在堆上分配的,
    很少有书,提到了activation record,frame和环境。

    读过其他语言实现书的读者,可能觉得这都没什么,
    不过,这些才刚刚开始罢了。

    后文又讲了,词法作用域如何实现,
    continuation如何实现,
    call stack和call graph的演变。

    最妙的是,站在了实现一门语言的角度,
    区分了用来实现语言的语言,和要实现的语言,
    谈论了scheme宏,以及怎样使用底层语言的特性,
    怎样实现一个非常小的子集,继而让它自己有扩展的能力。

    本书,介绍了读取器,怎么写,
    怎样用scheme的列表结构作为AST这种中间表示,
    介绍了解释器,怎样分情况处理,
    如何递归的解释。

    本书,介绍了卫生宏,怎样实现它,
    以及必要性,变量捕获问题,站在了更高的角度来讲。

    印象最深的,还是对continuation实现的讲解,
    其实后来发现,将call stack泛化为call graph,放到堆中,
    这也只是实现continuation的一种方法,
    常用的还有CPS。

    很多书提到了尾调用和尾调用优化,
    但是似乎都没有讲明白,还总是和continuation扯到一块,
    本书不然,尾调用优化的精髓在于对返回到哪个状态的处理,
    讲的透彻明白。

    CPS讲的最多的还是EOPL和Compiling with continuation,
    这两本。

    关于activation record和词法作用域,
    讲的多的,是Concepts in Programming Languages。

    Lisp in small pieces,
    这本书本来是很好的,但是是由法语翻译成英文的,
    难免丢失了很多原著的思想,读起来很费力,
    不过后面提及了指称语义,也是值得阅读的。

    回到本书来,
    对于quote的常量本质,一直以来不是特别清楚,
    知道读了本书的quote章节,作者花了很多文字来细讲,
    非常难得。

    而理解quote,不理解内存模型是不行的,
    所以,本书从头讲了,不惜文字。

    最后,本书不足的是,
    很多章节是残缺的,可能是因为书还没有写完,
    这是一个在线版。
    很多代码的例子也是不全的。

    不过这不影响思路,
    反而让我看到了很多作者的旁白,
    比如本段是否有用之类的,是否要再加上例子之类的话,
    很有趣。

    好了,千言万语,不如自己去尝试,
    本书是本文提及的几本书中,最值得推荐的,
    当然,更推荐是的全都看一看。