Scheme 于 1975 年由 Gerald J. Sussman 和 Guy L. Steele Jr.引入[28,29],是第一个完全支持词法作用域、一级过程和延续的 Lisp 方言。最初,它是一个小型语言,主要用于研究和教学,仅支持少量预定义的句法形式和过程。Scheme 现在是一种完整的通用编程语言,尽管它仍从一小组关键概念中获得力量。该语言的早期实现是基于解释器的,速度较慢,但一些当前的 Scheme 实现拥有生成代码与 C 和 Fortran 等低级语言最佳优化编译器生成的代码相媲美的复杂编译器。
本书旨在介绍 Scheme 编程语言,而不是一般编程的介绍。读者应具有一定的编程经验,并熟悉与计算机和编程语言常见相关术语。对于不熟悉 Scheme 或 Lisp 的读者,还应考虑阅读The Little Schemer[13],以熟悉列表处理和递归的概念。对编程新手应从编程入门文本开始。
Scheme 已经得到正式和非正式的标准化。Scheme 编程语言的 IEEE 标准[18]描述了一个正式的 ANSI/IEEE 标准的 Scheme,但可以追溯到 1991 年。一系列相关报告,“算法语言 Scheme 的修订报告”,记录了大多数实现支持的演变中的非正式标准。该系列中的当前报告是“算法语言 Scheme 的修订⁶报告”[24],于 2007 年完成。
本书涵盖了修订⁶报告的语言。它并不意图取代修订⁶报告,而是为语言提供更全面的介绍和参考手册,其中包含更多的解释性文本和示例,更适合用户而不是实现者。不包括特定于 Scheme 特定实现的功能。特别是,作者的 Chez Scheme 和 Petite Chez Scheme 实现的特定功能在Chez Scheme 用户指南中单独描述[9]。另一方面,没有一本关于 Scheme 的书籍会完整,而不涵盖交互式顶层,因为几乎每个 Scheme 系统都支持以某种形式进行交互使用,即使行为不受修订⁶报告的标准化。因此,第二章和第三章的撰写假定读者有一个支持交互式顶层的 Scheme 实现,其行为与早期报告和 IEEE/ANSI 标准中对顶层环境的描述一致。
散布在全文中的许多小到中等规模的示例,以及一个完整的章节专门介绍了一组更长的示例。许多示例展示了如何实现标准的 Scheme 语法形式或过程;其他示例实现了有用的扩展。所有示例都可以直接从键盘输入到交互式 Scheme 会话中。
本书分为十二章,还有附录部分。第一章描述了使 Scheme 成为一种有用且令人愉快的语言的特性和特点。第一章还描述了 Scheme 的符号约定以及本书中采用的排版约定。
第二章是为初学 Scheme 编程的新手 Scheme 程序员而编写的介绍,引导读者通过一系列示例,从简单的 Scheme 表达式开始,逐渐向更难的表达式发展。第二章的每个部分介绍了一小组相关特性,每个部分的末尾都包含了一组练习以供进一步练习。读者通过亲自动手输入示例并尝试练习,可以从第二章中学到最多。
第三章延续了介绍,但涵盖了更高级的特性和概念。即使是有 Scheme 经验的读者也可能希望通过那里找到的示例和练习进行学习。
第四章至第十一章构成了本文的参考部分。它们依次介绍了 Scheme 的每个原始过程和语法形式,将它们分组为一组相关的短节。第四章描述了用于创建过程和变量绑定的操作;第五章,程序控制操作;第六章,各种对象类型的操作(包括列表、数字和字符串);第七章,输入和输出操作;第八章,语法扩展;第九章,记录类型定义;第十章,库和顶层程序;以及第十一章,异常和条件。
第十二章包含了一系列示例过程、库和程序,每个都有简短的概述、其使用示例、实现及简要解释,以及一组进一步工作的练习。这些程序中的每一个都展示了一组特定的特性,它们共同展示了在 Scheme 中编程的适当风格。
在第十二章之后是参考文献、选定练习的答案、Scheme 程序和数据的正式语法的详细描述、Scheme 语法形式和过程的简要摘要,以及索引。形式和过程摘要是程序员们不确定一个语法形式的结构或者原始过程所需参数的结构的有用首选。形式和过程摘要中出现的页码以及索引中出现的斜体页码表示文本中定义形式和过程的位置。
因为参考部分描述了语言的许多方面,这些方面在引言章节中未涉及,并且提供了许多有趣的简短示例,大多数读者会发现阅读大部分材料是有益的,以熟悉每个特性以及其与其他特性的关系。然而,第六章比较冗长,可以略读,以后如有需要可以查阅。
本书的在线版本可在 http://www.scheme.com/tspl/ 上获得。在线版中的形式摘要和索引包括印刷版本的页码,因此可作为可搜索的索引。
关于插图: 封面插图和每个章节开头的插图都是由艺术家让-皮埃尔·埃贝尔创作的算法线场,灵感来自约翰·凯奇的著作。每个线场是通过任意数量的平行线网格的组合而创建的。这些网格是规则的,但也不是。例如,线的长度不规则,导致了不整齐的边缘。它们的色调和粗细略有变化。它们不是完全等距的。它们在一定角度上相交。当这个角度很小时,干涉图案就会产生。线首先被浸入各种标量场中,扭曲其原始的直线形状,然后投影在纸张的平面上。蒙版在一些层次上引入了孔洞。对于封面插图,网格被着以不同的色调。
所有的图片都是由一个单独的 Scheme 程序创建的,该程序主要依赖于偶然性做出决定。艺术家只控制画布大小、长宽比、整体色板以及偶然性和模糊度的水平。艺术家的任务是在正确的位置引入足够多的偶然性,以便结果既令人惊讶、有趣,又符合艺术家的审美感。这是一场不确定性、混沌和和谐的游戏。
致谢: 许多人以各种方式为本书的一版或多版的准备做出了贡献,包括布鲁斯·史密斯,尤金·科尔贝克,马蒂亚斯·费勒森,丹·弗里德曼,布鲁斯·杜巴,菲尔·戴比维格,盖伊·斯蒂尔,鲍勃·希布,克里斯·海恩斯,戴夫·普莱斯特德,琼·库里,弗兰克·席尔伯曼,帕维尔·柯蒂斯,约翰·韦特,卡尔·布鲁格曼,萨姆·丹尼尔,奥斯卡·沃德尔,迈克·阿什利,约翰·拉隆德,约翰·祖克曼,约翰·西蒙斯,鲍勃·普赖尔,鲍勃·伯格,以及阿齐兹·古卢姆。 还有许多其他人提供了小的修正和建议。 奥斯卡·沃德尔帮助创建了用于格式化本书印刷版和在线版本的排版系统。 少量文本和一些示例已从《修订⁶报告》中改编为本书,对于这本报告的编辑和为其做出贡献的许多其他人,我们表示感谢。 最后但最重要的是,我的妻子苏珊·戴比维格建议我首先写这本书,并在本书和以前版本的制作和出版过程中提供了她的专业知识和帮助。