本书简单的导读
2012-02-05
http://blog.lisp.tw/blog/2012/02/05/gentle-guide/
Lisp Gentle Introduction to Symbolic Computation 第二版
这本书出版于1990年,线上可免费阅读 (http://www.cs.cmu.edu/~dst/LispBook/),本书用14章带你入门Common Lisp 。
本书目标读者有三种:
* 第一次学编程的学生(只要懂算数就好)
* 打算研究 AI 领域的心理学家、语言学家、电脑科学家
* 电脑爱好者
初学者一开始都会被如何设定环境、怎么除错、特定的语法...等等议题给绊住并遭受挫折感。但初学者一开始只要先搞懂 Common Lisp 中,数字(number)、符号(symbol)及列表 (list)的差别就好了。
你或许听过"程序就是资料"这个概念,但这是一般初学Lisp 人主要感到困惑的来源。本书使用了大量图形化(箱子箭头标示法)来表示程序及资料。让你可以很轻松的分别它们。而电脑程序很难有这种表示法给你使用,所以在第一章及第二章,你只需要拿纸笔学习即可。这也让初学者免去了设定环境那些琐事而阻碍了你学Lisp 。
要是学过别种程序语言的人可以花一分钟读读第一章的总结就好,直接跳到第二章来学习基础的列表操作。
第三章讲标准的 EVAL 标示法。 Quote 的概念及如何命名变量。从本章起就可以开始使用电脑练习了。已经学了两章,你应该不会感到那么不安,甚至有很大的渴望想在电脑编程了。
另外三个,从第三章之后开始出现的特色是 Evaltrace 标示法、 Lisp Toolkit 小节以及为了Lisp 的数据结构所设计的,易于理解的图形表示法(包括了函数对象及符号的内部结构)。
Evaltrace给你演示一个Lisp表达式是如何求值的、函数是如何应用在自变量(argument)上及变数怎么创建及绑定的、 EVAL 与APPLY 的差别、变数的作用范围,嵌套的变数作用域...这些都可以图形化的解释,让你很简单记起来并使用它们。
Lisp Toolkit 介绍了你编程的好帮手,像是 Common Lisp 内建的DESCRIBE、INSPECT、TRACE、STEP 及除错器。还介绍了两个独特的工具(在 Appendix A 跟B 可以找到 source code)
* SDRAW 可以画 cons cell 的图,让你理解 CONS、LIST、APPEND 的差别。
* DTRACE 是 TRACE 的加强版,让你有更详细的追踪结果。
最后本章特别的介绍了符号的内部结构,包含了name, function, value, plist, package cells。帮助你理解 Lisp 直译器的本质,以及强调了符号、函数、变量与 print names 的区别。
应用的操作符 (Applicative operators)由第七章介绍,同时可以学到闭包 (lexcial closure)。
第八章讲一个龙的故事介绍递归,也介绍了一个递归的模版。
而本书在前 8 章提倡了简洁、无副作用程序设计风格。
第 9 章介绍了基本的输入输出。
第 10 章提供了一个一致的赋值方法,包含了普通的变量(ordinary variable)、通用的变量 (generalized variable)以及破坏性的序列操作(destructive sequence operations)。
第11章涉及到迭代 (iteration),以及演示了如何不使用显式赋值(explicitly assignment),用 DO 与 DO* 来创建可靠的迭代表达式。
第12章介绍了结构 (structures)。
第13章介绍了数组 (array)、哈希表 (hash table)以及属性列表(property list)。
第14章,也是最后一章,献给宏 (macro) 与编译 (compilation)。也解释了 lexcial 与 dynamic scoping。 Eval trace 图更阐明了macro与特殊变数(special variable)的语义。
这本书强调简单。像是排除掉使用1+ 1- 这种令人困惑的函数,或是像PUSHNEW 这种晦涩的函数。本书大部分使用了 EQUAL。而EQ、EQL、EQUALP 放在进阶的议题讨论。
而多值 (multiple value) 跟包系统 (package system)在本书不予讨论。
有些人可能会说,为什么不在入门课程使用比 Common Lisp 小巧精干的 Scheme 来教学。但我们可以用 Common Lisp 的子集,与Scheme 相同大小的子集来教,所以语言的大小不是问题。
另一个更使人信服的论调是,有一种应用程序设计的风格,大量使用到了词法闭包,可以更优雅地在 Common Lisp 来表达。
再举几个 Common Lisp 优于 Scheme 的地方来说,使用者可以自己定义宏、序列类型有优雅且一致的列表、向量表示法、用关键字自变量(keyword argument)来大量扩充列表函数的功能...等等。
结合了惊人的威力、广泛的软件支援以及内建的面向对象程序设计让Common Lisp 是唯一具有工业级水准的 Lisp 方言。
这本时同时设计给菜鸟程序员,以及非计算机专业的学生学习,但每章最后的进阶议题也可满足大三大四的求知欲比较高的学生。
大学生想更进一步学习的,可以学习 Common Lisp The Language 2/e 。初学者想要参考资料的可以查阅由 Franz Inc 公司所写的Common Lisp: The Reference。
Common Lisp The Language 2/e : http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/clm.html
Common Lisp The Reference : http://www.franz.com/support/documentation/8.2/ansicl/ansicl.htm