本书依旧沿袭TLS问答的风格,但与TLS中那种“导师在旁对你谆谆教诲”的感觉相比,本书更像是自言自语式的醒悟过程。
如果说TLS努力把Scheme、递归和函数式编程这些概念的外形轮廓印刻在读者的脑海中的话,本书则主要涉及对轮廓的优化。
本书的前半部分引入了从TLS初始就存在的问题(冗余),并通过三种新引入的结构解决这一问题:
1. 为了隐藏掉多余的函数参数、不必要的函数定义(优化抽象中的冗余),letrec被引入。letrec借助词法闭包以及对递归的支持,帮助函数定义内部的抽象子块(内部函数),使得函数的外轮廓更加清晰简单。
2. 为了省略冗余的运算过程(计算冗余),letcc被引入。和TLS中对于CPS(continuation passing style)的简要讨论一样,本书省略了对于FCC(first class continuation)概念的深入讨论。转而从实用角度介绍FCC,演示了通过FCC对goto,try/catch等高级的控制结构的实现。
3. 为了省略对冗余的相同表达式的计算(即是计算冗余又是抽象冗余),let被引入。通过let,如同通过letrec,可以定义函数内部的值抽象(内部变量)来使得函数的内部轮廓更加清晰简单。
之后,作者继续将优化和冗余作为本书的隐含线索,引入了副作用这个概念。
副作用是程序设计世界中老生常谈的问题。一般认为副作用是一个危险的概念。因为它会带来的许多问题,甚至这些问题可以上升到哲学层面。本书中,作者通过实例展现给读者的是副作用的善良面。在函数式中引入可控制的副作用是的可以使得诸如程序优化(cache)、调试(性能计数)等诸多方面变得简单。
最后的最后,本书回到FCC,稍微比较了副作用和FCC之间在某些应用中的相似点(但没有引出composite continuation)。然后回到在TLS最后讨论的有关解释器的相关问题(从函数式的角度)结束本书。