在一个春天的夜晚,好久也没怎么出门的我,偶然发现 Emacs Lisp 程序能够像脚本程序那般运行,而不仅仅是用于编写 Emacs 的配置文件或其插件。这个发现,让我觉得无意中发现了一宗瑰奇的宝藏,触手可及,之前却懵懵不知。
关于 Lisp 语言的源远流长及其与世上最好的文本编辑器 Emacs 的莫逆之交,有很多书籍和文章早已给出了严肃的介绍,在此我就不必再行考证和阐述了。没人发稿费,就没必要凑字数。下面,我想大致总结一下为什么我会觉得能像脚本程序那般运行的 Emacs Lisp 程序蕴含着一宗宝藏。
- Emacs Lisp 是一门绝对合格的编程语言,具备着通用的编程语言应该具备的元素,可以编写在计算机上解释运行的程序。
- Emacs Lisp 本质上是一种 Lisp 方言,自然继承了 Lisp 语言的一些特性。与那些更好的 Lisp 方言相比,Emacs Lisp 存在一些差距 1,却也无伤大雅,因为在通晓 Emacs Lisp 的基础上,再学习其他更好的 Lisp 方言,仅需要再理解寥寥几个新的概念,诸如续延(Continuation)、卫生宏(Hygienic macro)等。
- Emacs Lisp 语言具备良好的跨平台运行特性,这由 Emacs 的跨平台性所决定。Emacs 可在 GNU/Linux,Windows,Mac OS 以及 FreeBSD 等系统上运行,这就意味着使用 Emacs Lisp 语言编写的程序可毫无障碍地这些系统中运行。
- 由于 Emacs 自 版本 25 开始支持加载 C 语言编写的动态库,因而 Emacs Lisp 程序的性能瓶颈部分可基于 C 程序弥补。
- Emacs Lisp 具备其他编程语言可能没有的一些特性,这个特性并不来自语言,而是来自 Emacs 自身。迄今为止,Emacs 依然称得上世上最好的文本编辑器,它在文本处理方面长期以来凝聚了众多智慧,而这些智慧早已积淀形成了一个庞大的 Emacs Lisp 代码库。这是否意味着,在我使用 Emacs Lisp 编写一个程序用于处理某种特定格式的文本时,有近乎取之不尽的代码可用呢?
诚然,Emacs Lisp 有一些先天不足 2。不过,对于编写一个即使庞大的文本处理程序而言,Emacs 自身的存在足以证明这些先天不足是次要矛盾。我所说的能像脚本程序那般运行的 Emacs Lisp 程序蕴含着一宗宝藏,主要针对编写文本处理程序而言。
这份文档所讲述的,是我个人企图消费这宗宝藏的一些很小的尝试,只是这些尝试近似于 Emacs Lisp 教程或笔记的形式。我现在还不是 Emacs Lisp 专家。今后可能也不会是,我只是一个希望 Emacs Lisp 能在生活中发挥一些作用的人。
在之后的章节里,我将像许多人那样,将 Emacs Lisp 简称为 Elisp,以略微减轻手指关节的劳损。