首页>参考读物>计算机科学与技术>软件与程序设计

高阶Perl
作者 : (美)Mark Jason Dominus 著
译者 : 滕家海 译
丛书名 : 华章程序员书库
出版日期 : 2013-07-01
ISBN : 978-7-111-42773-5
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 391
开本 : 16
原书名 : Higher-Order Perl: Transforming Programs with Programs
原出版社: Elsevier (Singapore) Pte Ltd
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书共9章。第1~3章从几个简单的主题展开了讨论,例如递归和回调、分配表、记忆函数等技术,介绍了学习Perl所有必要的基础知识。第4章开始构建一个迭代器框架,它是本书其余部分的基础。在本书前面介绍的例子的基础上,对迭代器上进行了过滤和转换,从而展示这种代码模式可以立即在真实的世界中使用。第5 章介绍了划分问题、递归函数到迭代函数的转换以及阶乘和斐波纳级数的实现。第6章是有关无限数据流的问题。第7章介绍的是正则表达式字符串的生成问题。第8~9章是本书的核心,它实现了对其他函数进行操作的高阶函数,介绍并开发了通过本书框架进行制定规则和分析的功能,并实现了一个声明式绘图系统。

图书特色

这本书是我在至少十年内看到的最激动人心的、最清晰的、最全面的和最具前瞻性的编程书籍。它是指向你用任何语言编程的未来的地图。
—— Sean M. Burke,Comprehensive Perl Archive Network(CPAN)主程序员

大多数Perl程序员起初被训练成C和UNIX程序员,因此他们写的Perl程序与C程序非常相似。然而,Perl吸收了许多植根于其他语言(如Lisp)的特点。这些先进的特点没有得到很好的理解,也很少被大多数Perl程序员使用,但它们是非常强大的。它们可以完成用其他方法很难解决的日常编程问题。这些技术中最强大的一个是编写制造或修改其他函数的函数。例如,一位程序员不再需要写十个类似的函数,而是可以写一个通用的模板或框架,然后依照模板按需产生函数。数年来Mark Jason Dominus致力于把函数式编程技术应用到Perl中。现在他将自己在众多培训和训练课程中成功教授的这些灵活的编程方法带给了广大的读者。
本书是Perl编程领域的经典著作。它提供了数十个翔实的应用案例,足以涵盖编程过程中经常遇到的各种问题,由此详细阐释各种高效且简洁的写法。本书不仅探讨了Perl领域的经典问题,而且与时俱进地引入了许多Perl领域的新主题,使内容更加完善丰富,也更具实用性。

本书主要内容
概述递归与调用等参数化函数行为。
简单介绍代码引用的另一种用法——分配表。
深入分析解决性能问题的一个简单且普遍的做法——缓存。
详述迭代器的使用方式与应用实例。
讲解如何将通用递归函数转换到迭代器的技术。
介绍如何使用无限流来摒弃迭代器的缺陷,涉及链表、递归流、正则字符串等内容。
介绍如何将一个普通的函数转换成一个函数工厂以制造更多函数的currying技术。
讲解将未结构化的输入转换为数据结构的方式——解析。
介绍声明式编程的技术与应用。


作者简介




Mark Jason Dominus(陶敏修) 资深Perl技术实践者和研究者,对Perl技术有非常深刻的认识和理解,拥有丰富的实践经验。他是Tie::File、Text::Template和Memoize模块以及perlreftut手册页的作者,还是Perl核心贡献者之一。2001年赢得Larry Wall实用性大奖。热衷于分享,撰写了大量关于Perl的技术文章并分享在自己的博客上,由于文章技术含量高,所以非常受欢迎,这使得他在Perl技术圈内颇具知名度和影响力。他喜欢演讲,经常在大型公司和团体的Perl研讨会和培训课程上发表演讲或提供培训服务。

译者简介




滕家海 Perl技术实践者,精通Perl应用开发,对Perl技术拥有独到的认识和理解,近十年来一直参与Perl的实践开发,拥有丰富经验。业余时间潜心于技术的钻研,热衷于分享Perl技术,目前供职于一家IC设计公司,任CAD主管。

图书前言

在编程圈子里有一句著名的俗语,一个优秀的Fortran程序员可以用任何语言写Fortran程序。然而,让人悲哀的是,不管他们是否愿意,Fortran程序员用任何语言写Fortran程序。类似地,作为Perl程序员,我们也在用Perl写C程序,不管我们是否愿意。这让人羞愧,因为Perl是一门比C更富有表现力的语言。我们本可以做得更好,以C程序员梦想不到的方式使用Perl,但是我们没有那样做。
  怎么会这样呢?Perl的设计初衷是一方面作为C的替代品,另一方面作为UNIX脚本语言(如Bourne Shell和awk)的替代品。Perl最初的主要拥护者是UNIX系统管理员,他们熟悉C和UNIX脚本语言,因此自然地倾向把Perl程序写成类似于C和awk的程序。Perl的发明人(Larry Wall)来自这个系统管理员社区,还有Randal Schwartz,与Perl合著了《Programming Perl》,本书是第一本也仍然是最重要的一本Perl参考著作。其他重要的早期贡献者还包括Tom Christiansen,也是古董级C与Unix专家。即使Perl程序员不是来自Unix系统管理员社区,他们也被其中的人或者其中的人训练的人训练成那样。
  大约在1993年我开始阅读关于Lisp 的书,我有一个重要的发现:Perl更像Lisp而不是C。如果你拿起一本优秀的Lisp书,其中会有一段文字描述Lisp的优秀特点。例如,《Paradigms of Artificial Intelligence Programming》,作者Peter Norvig,有一节标题是“是什么让Lisp与众不同”,其中就描述了Lisp的七个特点。Perl分享了其中六个,C一个也没有分享。这些是巨大的、重要的特点,如头等函数、符号表的动态访问以及自动存储管理。Lisp程序员自1957年以来就在使用这些特点。他们知道如何高效使用这些语言特点的许多方法。如果Perl程序员能发现这些Lisp程序员已经知道的事情,那么他们将学到许多使Perl编程工作更轻松的方法。
  说比做容易。几乎没有人愿意听Lisp程序员的。Perl人对Lisp心存芥蒂,就像Larry Wall 的著名评论所表明的,Lisp与混合了剪下的指甲碎屑的燕麦看起来一样。Lisp程序员经常制造像“cons”与“cooder”的滑稽噪声,他们还讨论像PC loser-ing问题的东西。他们相信Lisp比其他语言更好,他们也是这么说的,这让人不快。但是现在一切都好了,因为现在你不必听Lisp人的了。你可以听我的。我将制造一些轻缓的关于散列和存储以及glob的噪声,并讨论流行的和令人鼓舞的软引用与变量销毁问题。与其告诉你Lisp有多么好,不如告诉你Perl有多么好,到最后你将不会对Lisp有任何认识,但是对Perl知道得将会更多。
  然后你可以停止用Perl写C程序了。我认为你将发现这是一个很好的改变。Perl就是Perl的样子,比一个慢版本的C好得多。当你写Perl程序而不是C程序时,你将惊喜于所能够做到的。
网站
  本书中的所有代码示例可以从如下网站获得:
  http://perl.plover.com/hop/
  当代码段中标示某某例子的标签时,那段代码就可以从如下网址下载:
  http://perl.plover.com/hop/Examples/some-example
  该网站还包括完整的文本、一个勘误表,以及其他有趣的内容。针对本书有任何问题都可以给我发电子邮件,请发邮件至mjd-hop@plover.com。
致谢
  每段致谢都以这样一句开头“要是没有我的编辑Tim Cox不知疲倦的支持与协助,这本书肯定还没写完”。除非你写一本书,不然你将不会意识到这是多么真实的。在这里我无法用语言表达,要是没有Tim不知疲倦的支持与协助,这本书就不会写完,感谢他的贡献、友善,还有他极大的耐心。
  这本书姗姗来迟,在我工作的时候Tim经历了三位助理。所有这些人都是乐于助人的和能干的,因此我谢谢Brenda Modliszewksi、Stacie Pierce以及Richard Camp。“能干的”听起来可能无力,但是我认为这是最高的褒奖。
  多谢产品经理Troy Lilly与Simon Crump,不仅是能干的而且与他们合作愉快。
  临近成书之前,我开始为实例代码写测试。我厌恶地认识到几乎没有程序工作正常。有大量的小错误(有些也不小),代码与输出之间的不兼容、排版等。谢谢Robert Spier在最后关头的英勇,我认为他捕获了这些错误里的大部分。Robert不仅确实是能干的、乐于助人的、富有成效的,而且确实是活泼开朗的。如果本书中的任何代码程序运行如预期,那么要感谢Robert。(如果不是这样,你应该责备我,而不是Robert。)Robert也负责命名我用来准备手稿的MOD文件准备系统。
  我妻子Lorrie Kim的贡献太多太大以至于无法一一描述。本书题献给她。
  其他许多人对本书作出了贡献,但是他们中许多人在当时并不知道。我幸运地拥有许多卓越的老师,我有时不得不狠狠地考验他们的忍耐力。谢谢Mark Foster、Patrick X. Gallagher、Joan Livingston、Cal Lobel(第一位教我编程的老师)、Harry McLaughlin、David A. J. Meyer、Bruce Piper、Ronnie Rabassa、Michael Tempel以及Johan Tysk。正当我认为一切都错过了的时候,Mark Foster鬼使神差地为本书建议了书名。
  本书直接从两本更早的书获得灵感:《ML for the Working Programmer》,作者Lawrence Paulson,以及《Structure and Interpretation of Computer Programs》,作者Harold Abelson 和Gerald Jay Sussman。其他有重要影响的是《Introduction to Functional Programming》,作者Richard Bird 和Philip Wadler,以及《Paradigms of Artificial Intelligence Programming》,作者Peter Norvig。
  正式的技术阅校者的工作报酬比他们可能在别的项目中更低。这本书花了很长时间写就,尽管我想与阅校者就每件小事进行长时间交谈,但是我害怕如果那么做了,我将永远也不会完成。所以我很少与阅校者联系,也许他们认为我只是把他们的建议塞进了碎纸机。但我不是那样的,我极其认真地仔细研究他们所有的批评,并为这些批评中的大多数伤脑筋。我要谢谢阅校者:Sean Burke、Damian Conway、Kevin Lenzo、Peter Norvig、Dan Schmidt、Kragen Sitaker、Michael Scott以及Adam Turoff。
  在写作的时候,我维护了对本书感兴趣的人的一个邮件列表,并把未定稿的章节发到邮件列表。这非常有帮助,我已经把这种做法推荐给其他人。我的邮件列表的650个令人惊奇的成员无法一一列在这里。他们都是提供了帮助与支持的,本书由于他们的投入而更加完美。一些突出的人贡献了大量的具体内容:Roland Young、Damien Warman、David “Novalis” Turner、Iain “Spoon” Truskett、Steve Tolkin、Ben Tilly、Rob Svirskas、Roses Longin Odounga、Luc St-Louis、Jeff Mitchell、Steffen Müller、Abhijit Menon-Sen、Walt Mankowski、Wolfgang Laun、Paul Kulchenko、Daniel Koo、Andy Lester、David Landgren、Robin Houston、Torsten Hofmann、Douglas Hunter、Francesc Guasch、Kenneth Graves、Jeff Goff、Michael Fischer、Simon Cozens、David Combs、Stas Bekman、Greg Bacon、Darius Bacon,以及Peter Allen。我向许多提供帮助的贡献者道歉,考虑到片幅问题我没有放在上面的列表里,更要向我意外遗漏的几个特别有帮助的贡献者道歉。
Wolfgang Laun和Per Westerlund特别勤勉地帮助我纠正第二次印刷的错误。
  在开始写作以前,我收到了关于挑选出版社的有价值的建议,它们来自Philip Greenspun、Brian Kernighan和Adam Turoff。Damian Conway和Abigail对我的提议给予了有帮助的建议与批评。
  Sean Burke 录下了我的象牙塔谈话,刻成CD并发给我,还在最后一刻提供了有关RTF的咨询。他定期发邮件提醒我,书到什么流程了,还经常在我无法确定的时候到访。
  第4章里几个特殊的想法是由其他人建议的。Meng Wong 建议了聪明与恰当的“里程表”比喻。Randal Schwartz 帮我“增补”函数。Eric Roode 建议了多列表迭代器。
  当我需要读Paul Graham绝版的书时,A. E. Sundstrom借给了我。当我需要《The Art of Computer Programming》第二卷的时候,Hildo Biersma与Morgan Stanley为我买来了。当我需要钱的时候,B. B. King就借给我一些。谢谢他们所有人。
第9章的约束系统绘制程序是一个大项目,我很长时间盯着该项目。要是没有Wm Leler 及时的帮助,我可能还盯着呢。
Tom Christiansen、Jon Orwant以及Nat Torkington 在使我融入Perl社团方面扮演了主要的与不可替代的角色。
  最后,“没有这个,这本书不可能写成”语句不能结束,要是不感谢Larry Wall 写了Perl并创立了Perl社团,没有这个,这本书不可能写成。

专家评论

作为一个程序员,你的书架上可能堆满了对自己编程的方式或思考编程的方式没有什么改变的书。
  你需要特为此书设置一个完全不同的隔板。
  在第3章讨论缓存技术时,Mark Jason Dominus指出了在能力上一个足够巨大的改进以改变你思考技术的基本方式。那恰恰是这整本书为Perl所做的。
  它探索了计算机科学最深的穹底与最高的塔尖,把它找到的许多晦涩难解的珍宝—递归、迭代器、过滤器、记忆术、划分、数值方法、高阶函数、currying、切断排序、基于语法的解析、惰性求值和约束编程等转换成现实编程工作中强有力与实用的工具—文件系统互动、HTML处理、数据库访问、网页抓取、排版、邮件处理、家庭理财、文本描图和图表生成。
  一路上它也散布了小一些的(但是同样无价的)珍宝,如在第3章对“作用域”与“有效期”区别的优雅解释说明,或在第4章对返回错误标记有多么好的细致研究。它甚至对Perl传教士也有实用的妙法。
  Dominus以简单和可理解的方式展现了甚至是最复杂的想法,但是在精确度与对细节的关注度上毫不妥协,为此他受到了广泛的与应得的尊敬。
  他的作品是一如既往的清楚的、有说服力的、机智的以及引人入胜的。
  命名巧妙,这确实是一本高阶Perl实战图书,也是每个严肃的Perl程序员的必备读物。
    —Damian Conway
    Perl 6设计者之一

上架指导

计算机\程序设计

封底文字

这本书是我在至少十年内看到的最激动人心的、最清晰的、最全面的和最具前瞻性的编程书籍。它是指向你用任何语言编程的未来的地图。
——Sean M. Burke,Comprehensive Perl Archive Network(CPAN)主程序员

大多数Perl程序员起初被训练成C和UNIX程序员,因此他们写的Perl程序带有与C程序强烈的相似性。然而,Perl吸收了许多植根于其他语言(如Lisp)的特点。这些先进的特点没有得到很好的理解,也很少被大多数Perl程序员使用,但它们是非常强大的。它们可以完成用其他方法很难解决的日常编程问题。这些技术中最强大的一个是编写制造或修改其他函数的函数。例如,一位程序员不再需要写十个类似的函数,而是可以写一个通用的模板或框架,然后依照模板按需产生函数。数年来Mark Jason Dominus致力于把函数式编程技术应用到Perl。现在他将自己在众多培训和训练课程中成功教授的这些灵活的编程方法带给了广大的读者。
本书是Perl编程领域的经典著作。它提供了数十个翔实的应用案例,足以涵盖编程过程中经常遇到的各种问题,由此详细阐释各种高效且简洁的写法。本书不仅探讨了Perl领域的经典问题,而且与时俱进地引入了许多Perl领域的新主题,使内容更加完善丰富,也更具实用性。

本书主要内容

 概述递归与调用等参数化函数行为。
 简单介绍代码引用的另一种用法——分配表。
 深入分析解决性能问题的一个简单且普遍的做法——缓存。
 详述迭代器的详细使用方式与应用实例。
 讲解如何将通用递归函数转换到迭代器的技术。
 介绍如何使用无限流来摒弃迭代器的缺陷,涉及链表、递归流、正则字符串等内容。
 介绍如何将一个普通的函数转换成一个函数工厂以制造更多函数的currying技术。
 讲解将未结构化的输入转换为数据结构的方式——解析。
 介绍声明式编程的技术与应用。

作者简介

(美)Mark Jason Dominus 著:暂无简介

译者简介

滕家海 译:暂无简介

译者序

这本书是Perl社区公认的一本好书,Perl 6的开发者之一Conway也不吝赞美。本书的讲解是轻松、细致和严谨的,如果你了解Perl的基本语法或者对Perl感兴趣并乐于钻研,那么本书有可能极大地扩展你对Perl的认识。
  几年前我第一次读到本书时,完全被它震撼,原来Perl可以这么优雅与强大。后来一边读一边默默祈祷能有中译本。直到去年年初,我苦苦等待的还是没有到来,于是我萌发了一个大胆的念头:何不自己试试?在草稿翻译过半以后,我就电话联系了机械工业出版社华章分社……现在你就看到中译本了。
  此中译本是依照原书第2次印刷版所翻译的,所有的勘误已经订正。翻译的过程是很愉快的,因为这是我非常喜欢的书。为了它,我把很久不用的几本词典都放在了手边;为了它,我学会了LATEX;为了它,我戒掉了周末睡懒觉的坏习惯。所有付出的回报就是很高兴能与大家分享这本好书。尽管付出了最大的努力,但是一定还有一些不足之处,敬请批评指正。
网站
  承蒙作者的美意,中译本的勘误和索引等内容也放在他的网站上:
  http://perl.plover.com/hop/chinese.html
  原书的代码示例由边注标明,在中译本中改成了在代码前增加一行“### Code Library: some-example”,代码依旧可以从如下地址下载:
  http://perl.plover.com/hop/Examples/some-example
  如果对本书有任何意见或建议,请发邮件给我:jhteng@gmail.com。
致谢
  这本书的出版得到了许多人的帮助与支持,没有他们的辛勤付出,这本书是不可能完成的。
  首先感谢机械工业出版社华章分社的诸位编辑。感谢姚蕾女士的信任,在我推荐之后认真地了解了此书并积极与原出版社联系,这才促成了此中译本的出版。还要感谢杨福川先生和秦健先生,他们经常积极回复我的电话和邮件,并耐心细致地解答和帮助,秦健先生还在审阅过程中指出了此书的许多错误,给予了许多宝贵的意见。还要感谢在幕后辛勤付出的排版、校对、封面设计等编辑,本书的完成不能缺少他们的付出。如果你看到某些句子明显比其他句子更通顺合理,那是出版社各位编辑的功劳,如果您看到一些聱牙的句子,那全都是我的责任。
  其次要感谢李剑先生。他在网络上分享了前三章译稿,这也是作者向我推荐的。我在翻译结束后参考了李剑先生的译作,并纠正了此书中的几处错误。
  还要感谢我的家人,在他们的理解与支持之下,近一年以来我把几乎所有的业余时间都投入了翻译之中。
  最后要感谢作者Mark Jason Dominus(陶敏修)先生,他不仅耐心细致地解答我全部的疑问,主动给予我一些对翻译有帮助的资料,还很有兴趣地指出了几个可能译错的地方,居然还真有一个被说中(你猜猜是哪句?)。总之,与他的沟通是愉快的且获益匪浅。要是没有他热忱的帮助,我是不可能完成此书的。Thank you, Dominus!

滕家海

图书目录

本书赞誉
译者序
前言
第1章 递归与回调 1
1.1 十进制到二进制的转换 1
1.2 阶乘 2
1.2.1 为什么私有变量是重要的 3
1.3 汉诺塔 4
1.4 层次化数据 8
1.5 目录遍历的应用和变化 11
1.6 函数式编程与面向对象式编程 17
1.7 HTML 17
1.7.1 更灵活的选择 21
1.8 当递归膨胀时 22
1.8.1 Fibonacci数 22
1.8.2 划分 24
第2章 分配表 27
2.1 配置文件处理 27
2.1.1 表驱动配置 28
2.1.2 分配表的优势 29
2.1.3 分配表策略 32
2.1.4 默认行为 34
2.2 计算器 35
2.2.1 再访HTML处理 38
第3章 缓存与记忆术 41
3.1 缓存修正递归 42
3.2 内联缓存 43
3.2.1 静态变量 44
3.3 好主意 44
3.4 记忆术 45
3.5 MEMOIZE模块 45
3.5.1 作用域和有效期 47
3.5.2 词法闭包 49
3.5.3 再谈记忆术 52
3.6 CAVEATS 52
3.6.1 返回值不依赖参数的函数 52
3.6.2 有边界效应的函数 53
3.6.3 返回引用的函数 53
3.6.4 带记忆的时钟 54
3.6.5 非常快的函数 54
3.7 键的生成 55
3.7.1 用户提供的键生成器的更多应用 58
3.7.2 内联的参数归一化的缓存管理 59
3.7.3 带有引用参数的函数 61
3.7.4 划分 61
3.7.5 为非纯函数定制的键生成 62
3.8 对象方法里的缓存 62
3.8.1 对象方法的记忆术 64
3.9 持续的缓存 65
3.10 可供选择的记忆术 66
3.11 传播福音 71
3.12 速度的好处 71
3.12.1 剖析和性能分析 72
3.12.2 自动剖析 73
3.12.3 钩子 74
第4章 迭代器 75
4.1 简介 75
4.1.1 文件句柄是迭代器 75
4.1.2 迭代器是对象 76
4.1.3 迭代器的其他普通实例 77
4.2 自制迭代器 78
4.2.1 一个平凡的迭代器:upto() 78
4.2.2 dir_walk() 80
4.2.3 聪明的灵感 81
4.3 实例 82
4.3.1 排列 83
4.3.2 基因组序列生成器 88
4.3.3 文件句柄迭代器 91
4.3.4 一个纯文本文件数据库 91
4.3.5 反向搜索数据库 97
4.3.6 随机数生成 100
4.4 过滤和变换 103
4.4.1 imap() 103
4.4.2 igrep() 105
4.4.3 list_iterator() 106
4.4.4 append() 106
4.5 半谓词问题 107
4.5.1 避免问题 108
4.5.2 可选的undef 109
4.5.3 重写功能函数 111
4.5.4 返回多个值的迭代器 112
4.5.5 明确的耗尽函数 112
4.5.6 四操作数迭代器 114
4.5.7 迭代器方法 116
4.6 可选的迭代器界面 116
4.6.1 用foreach循环多个数组 117
4.6.2 带有类each界面的迭代器 120
4.6.3 系住变量界面 121
4.7 一个扩展的例子:网页抓取 124
4.7.1 仅追逐有趣的链接 126
4.7.2 参考URL 127
4.7.3 robots.txt 130
4.7.4 总结 132
第5章 从递归到迭代器 134
5.1 再访划分问题 134
5.1.1 搜寻所有可能的划分 136
5.1.2 优化 138
5.1.3 变化 139
5.2 如何把一个递归函数转换成一个迭代器 142
5.3 一个通用的搜索迭代器 149
5.4 其他通用的移除递归的技术 152
5.4.1 尾调用移除 152
5.4.2 产生尾调用 159
5.4.3 明确的栈 161
第6章 无限流 170
6.1 链表 170
6.2 惰性链表 171
6.2.1 一个平凡的流:upto() 172
6.2.2 流的功能函数 173
6.3 递归流 175
6.3.1 使流带记忆 176
6.4 HAMMING 问题 179
6.5 正则字符串生成 181
6.5.1 按次序生成字符串 189
6.5.2 正则匹配 191
6.5.3 切断排序 192
6.6 NEWTON-RAPHSON方法 200
6.6.1 近似流 203
6.6.2 导数 203
6.6.3 乌龟和兔子 205
6.6.4 金融 207
6.7 幂级数 209
6.7.1 导数 213
6.7.2 其他函数 213
6.7.3 符号计算 213
第7章 高阶函数与currying 217
7.1 currying 217
7.2 普通的高阶函数 222
7.2.1 自动的currying 223
7.2.2 原型 225
7.2.3 更多的currying 227
7.2.4 还是更多的currying 228
7.3 reduce()和combine() 229
7.3.1 布尔操作符 232
7.4 数据库 234
7.4.1 操作符重载 238
第8章 解析 239
8.1 词法分析器 239
8.1.1 评估<>操作符 240
8.1.2 更通用的词法分析器 243
8.1.3 链式词法分析器 245
8.1.4 偷看 249
8.2 一般的解析 250
8.2.1 语法 250
8.2.2  解析语法 254
8.3 递归下降解析器 256
8.3.1 非常简单的解析器 257
8.3.2 解析器操作符 258
8.3.3 合成的操作符 259
8.4 算术表达式 261
8.4.1 一个计算器 267
8.4.2 左递归 267
8.4.3 star()的一个变体 272
8.4.4 通用操作符解析器 275
8.4.5 除错 277
8.4.6 完成的计算器 283
8.4.7 错误诊断和矫正 285
8.4.8 大数 290
8.5 解析正则 290
8.6 大纲 294
8.7 数据库查询解析 299
8.7.1 词法分析器 299
8.7.2 解析器 301
8.8 回溯解析器 304
8.8.1 续篇 305
8.8.2 解析流 308
8.9 重载 310
第9章 声明式编程 315
9.1 约束系统 315
9.2 本地传播网络 315
9.2.1 实现一个本地传播网络 317
9.2.2 本地传播的问题 325
9.3 线性方程 326
9.4 linogram:一个绘图系统 327
9.4.1 方程 334
9.4.2 值 343
9.4.3 特征类型 354
9.4.4 解析器 360
9.4.5 缺失的特征 373
9.5 总结 375

教学资源推荐
作者: 邱李华 曹青 郭志强 编著
作者: 王珊珊 臧洌 张志航 编著
作者: [美] 基普·R.欧文(Kip R.Irvine) 著
作者: 陈帆 和红杰 周荣辉
参考读物推荐