我是一个任性的人,急躁而缺少规划,总是为了兴趣冲动地投入大段人生。我庆幸自己生活在一个好时代,有程序员这样有趣的工作可以做,有方便的现代生活和发达科学技术。
我做的很多事,都远远超出了我*初的想法。当初,我只是想学一些方便、优雅的编程语言,可以让懒惰的我更自如地表达思考成果,并完成工作。后来,我又希望自己能够学会一些基本的编译器知识,包括代码的解析技术。这两个方向的学习把我神奇地引向了组合子。
这是一个有趣的方向。回头看看,这个领域并没有我*初想象的那么神奇,它可以说是一个很特定的编程模式,能漂亮地解决一些问题,但是它并不是万能的,也有很多它不能优雅地解决的问题。
在我们那个年代非常热门的函数式编程同样如此,它有不小的价值,但也不是银弹,并不比流行的编程语言更“高级”。如今我*喜欢的、*常用的编程技术,都不是“纯粹的”函数式的或面向对象的,它们都是精彩的组合体。
感谢发明这些编程语言和技术的同行,他们创造了这么多有用且有趣的东西,让我不仅仅限于日常的业务开发,更能在编程中找到乐趣,指引我思考是否有更好的工作方式。计算机科学家和天才工程师对“纯粹”的追求,贡献了很多有价值的思想,进而才有了我现在喜爱的各种工具。
年轻时,我曾幻想在学习编程的过程中建立“思想”。现在,工作二十几年后,我甚至不确定是否还有这种想法,但是我很确定,我找到了很多乐趣。
此时此刻,我才发现完成这本书的感受是“我做了一件有趣的事”。
写这本书时,我尽量使用朴素的语言,不带任何情绪。但是我希望它可以给读者带去乐趣。这本书介绍了一个有趣的编程范式,可以通过精巧的设计,实现对复杂信息模式——尤其是文本——的分析和处理。
初学者学习了Java或Scala的语法后,可以把这本书当作补充教材。它完整地实现了一个精巧却相对简单的项目,可以让读者在不依赖额外复杂框架和技术工具的情况下,完整地体验一个软件项目的全过程。编写这个解释器需要的Parsec组合子库也是由常规代码构成,它简单到我们可以在书中讨论如何从零构造。
这本书也可以作为有经验同行的一本业余读物。我喜欢看一些有趣的手工作品,例如木制计算机、乐高积木拼出的复杂机械装置、蔚为壮观的多米诺骨牌等。我觉得这本书也可以算在此列——我们可以用“常规”的编程技术实现通常认为需要专业工具构建的文本(甚至任意信息“串”)分析程序。它不仅有用,而且还很有趣。
这本书的写作灵感来自著名的Haskell教材《Write Yourself a Scheme in 48 Hours》。我在自己使用的编程语言中实现了Parsec组合子库,然后实现了若干微型LISP解释器。在回顾开发过程时写了这本书。通过实现LISP解释器讲解组合子技术、介绍函数式编程的方式是从那本书里借鉴的。我不是伟大的先行者,我只是一个吟游诗人,站在前人走过的路上,努力向后来者述说沿途的风景。如果有读者从中收获了知识和技巧,找到了共鸣和乐趣,那就是我的荣幸了。
有幸写完这本书,要感谢妻子多年来对我的包容和支持。我为了兴趣做了太多任性的事,花了太多时间学习一些工作中不太可能用到的编程技术。
本书的编辑徐定翔老师,是我多年来选购和阅读技术书籍时非常信任的人。因为徐老师的工作,我读到了很多精彩的书籍,学到了很多知识。这次能够与他合作出版这样一本书,是我的荣幸。
展开