首页>参考读物>计算机科学与技术>计算机辅助设计与工程计算

GNU Emacs Lisp 编程入门
作者 : (美) Robert J.Chassell
译者 : 毛文涛 吕芳
丛书名 : GNU技术文档精粹
出版日期 : 2001-05-01
ISBN : 7-111-08862-X
定价 : 38.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 216
开本 : 16开
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 已绝版
图书简介

本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他精通GNU Emacs Lisp的每一个方面。本书是一本GNU Emacs Lisp的编程入门,全书循序渐进地介绍了GNU Emacs Lisp编程的各种基础知识和方法,文笔流畅、讲解透彻,对GNU Emacs用户提高对它的理解和运用帮助极大。

图书前言

GNU Emacs 文本编辑器的绝大多数代码是用一种被称为 Emacs Lisp 的编程语言编写的。用这种语言编写的代码就是这个软件—指令集—用户通过它向计算机发布命令以告诉计算机如何工作。Emacs 就是为使你能用 Emacs Lisp 编写新的代码并能方便地作为编辑器的扩展部分来安装而设计的。这也是为什么 Emacs被称作“可扩展的编辑器”的原因。
因为 Emacs 的确提供了比编辑更多的功能,它或许应当被称为“可扩展的计算环境”,但是这个词显得口气太大。同样,在 Emacs 中做的任何事情—查找玛雅年代和月相、简化多项式、调试代码、管理文件、阅读信件以及撰写图书—所有这些活动都是“编辑”这个词所包含的。
虽然人们经常将 Emacs Lisp 与文本编辑器联系到一起,但它却是一种完整的计算机编程语言。可以像使用任何其他编程语言一样使用它。
也许你希望理解编程;也许你希望扩展 Emacs;或者也许你希望成为一名程序员。这本入门教程就是为你开始 Emacs Lisp 之旅而设计的:引导你学习编程基础,更重要的是告诉你如何自学提高。
在整本书中,你将看到为数不多的几个程序例子,你可以在 Emacs 中运行它们。如果用 GNU Emacs 的 Info 阅读本书文档,可以在例子程序出现时运行它们。(这很容易做到,我们将在例子出现时作进一步解释。)同时,你也可以将这本教程作为一本印刷的图书一样,当你坐在计算机旁运行 Emacs 时阅读。(这就是我所喜欢的方式,我喜欢印刷出来的纸版图书。)如果你身边没有一个运行的Emacs,你仍旧可以阅读这本书,但是在这种情况下,最好将其作为一本小说或者是一本你未到过的某个国家的导游手册来阅读:这样读起来会较有趣,但是你的收获会与亲身体验不同。
本教程用许多篇幅介绍 GNU Emacs 用到的代码。教程的这些设计安排有两个目的:一是使读者熟悉真实的正在运行的代码;二是使读者熟悉 Emacs 工作的方式。弄清一个编辑器如何工作是很有趣的。同样,我希望读者养成浏览源代码的习惯。读者可以从中学习并开阔思路。有了 GNU Emacs,就像拥有一个龙穴宝藏一样。
除了将 Emacs 当做一个编辑器、将 Emacs Lisp 当做一门编程语言学习之外,书中的例子和导引将使读者通晓将 Emacs 作为Lisp 编程环境的机会。GNU Emacs 支持编程,并提供了你将乐于使用的工具,如 “M-”(这是调用 find-tag 命令的键)。你还可以学习缓冲区和其他对象,这些都是编辑环境的组成部分。学习 Emacs 的这些功能就像熟悉家乡周围的新路一样。
最后,我希望传授一些使用 Emacs 来学习编程时读者不知道的技巧。你可以经常用Emacs 来解决那些困扰你的问题,并用它们做一些新奇的事情。这种自力更生不仅是一种乐趣,更是一种优点。
读者对象
这本教程是作为入门读物为那些非编程人员编写的。如果你是一名程序员,可能并不满足这本初级读物。原因在于你可能已经通过阅读参考手册成了专家。或许本书的组织方式已经使你失去兴趣。
一位评论过本书的编程专家曾这样对我说:
我更喜欢从参考手册中学习(编程)。我“潜入”每一个段落,并在段落之间跃出“水面”呼吸空气。
当到达一个段落结尾时,我假定这个主题已经结束。我知道了需要知道的所有东西(也可能存在这样的可能性,那就是下一个段落将对这个主题作更加详细的讲解)。我期望一份认真撰写的参考手册不要出现太多的冗余,并且它应指引我学习所希望的知识。
这本入门教程并不是为这类读者撰写的!
首先,我试图就每一件事情至少说上三遍:第一次介绍它;第二次在文中详细展现它的内容;第三次在不同的地方揭示它,或者复习一下。
其次,我几乎从不将一个主题的所有内容放在一个地方讲完,更不放在某一段中。以我思考的方式而言,那样做会给读者强加过重的负担。相反,我试图仅仅解释在那种情况下你需要知道的东西(有时会增加一点点附加信息,在后面读到这些附加信息的正式介绍时无需惊讶)。
阅读本书的时候,我并不指望你第一次就学会所有的东西。通常的情况是你仅需要对某些内容略微了解。我希望已经组织好本书,为你提供了足够的信息,并提醒你哪些是重要的线索,且着重讲述它们。
你应当“潜入”某些段落,除此以外没有其他方法。但是我已尽力减少这类段落。希望本书成为一座可以攀越的小山,而不是一座使人畏缩的高峰。
《GNU Emacs Lisp 编程入门》还有一个姊妹篇,那就是《GNU Emacs Lisp 技术手册》。那本手册比本书更详细。在那本手册中,关于任何一个话题的所有信息都集中在一个地方。如果你喜欢上面引用的那位程序员所欣赏的学习方法,那么应当掉头去阅读那本技术手册。当然,阅读完这本编程入门后,在编写自己的程序时,你会发现那本技术手册很有用。
Lisp 的历史
Lisp 是20世纪50年代晚期在麻省理工学院为研究人工智能而被首先发展起来的。Lisp语言的强大功能使之也能用于其他目的,比如编写编辑器命令。
GNU Emacs Lisp 在很大程度上得益于20世纪60年代在MIT编写的 MacLisp 。它同时也得益于在20世纪80年代成为标准的 Common Lisp。然而,Emacs Lisp 比 Common Lisp 简单得多(标准的 Emacs 发行版本中包含一个可选的扩展文件“cl.el”,它为 Emacs Lisp 增加了许多 Common Lisp 的特性)。
初学者注意
如果你不知道 GNU Emacs,阅读本书仍旧有益。但是,如果仅仅是想学习在计算机屏幕上如何操作,建议你学习 Emacs。可以通过在线教程自学如何使用 Emacs。为使用在线教程,按下组合键 C-h t(这意味着同时按下并释放 CTRL和 h 键,然后按下并释放 t 键)。
同样,我经常在提到 Emacs 的标准命令时列出激活该命令时应按下的键序列,然后在括号中给出命令名,例如:M-C-\(indent-region)。这意味着indent-region命令通常是通过输入键序列:M-C-\ 来激活的(如果你愿意的话,可以改变激活这个命令的键序列,这称作“重新绑定”。参见16.11节,“键图”)。缩写 M-C-\ 意味着同时输入 META 键、CTRL 键和 \ 键。有时,像这样的一个组合键也叫做一个键和弦,因为它类似于在钢琴上演奏一个和弦。如果你的键盘没有 META 键,可以用前缀 ESC 键取代它。在这种情况下,M-C-\ 意味着按下并释放 ESC 键,然后同时按下并释放 CTRL 键和 \ 键。
如果用 GNU Emacs 的 Info 阅读这份文档,只用空格键就能翻阅整本书(可以输入 C-h i 然后选择 Info 来学习)。
关于术语的说明:当仅仅提到 Lisp 这个词时,常常是指各变种的Lisp;但是当提到 Emacs Lisp 时,就是特指 GNU Emacs Lisp 了。
致谢
感谢所有对这本书提供了帮助的人们。特别感谢 Jim Blandy、Noah Friedman、Jim Kingdon、Roland McGrath、Frank Ritter、Randy Smith、Richard M. Stallman 和 Melissa Weisshaus。同时要感谢 Philip Johnson 和 David Stampe耐心的鼓励。书中的所有错误都由我负责。

作者简介

(美) Robert J.Chassell:暂无简介

译者简介

毛文涛 吕芳:暂无简介

译者序

GNU Emacs 长期以来一直是自由软件基金会的旗舰产品。它是由理查德·斯托曼(Richard Stallman)博士为 GNU 工程开发的第一个自由软件。在所有目前已开发的 GNU 软件中,GNU Emacs 的作用和地位是非常突出的,因为几乎所有其他的自由软件基金会的工具都是用GNU Emacs 编写出来的。
从编程实践上看,GNU Emacs 有许多特点。其中最为突出的一个特点是斯托曼在创造 GNU Emacs 编辑器时非常巧妙地揉合了用Lisp 语言和 C 语言编写的代码。
斯托曼利用 Lisp 语言编写 GNU Emacs 的大部分代码不是偶然的。Lisp 语言发明于20世纪50年代,并广泛地应用于人工智能研究领域,而斯托曼早年曾经在麻省理工学院人工智能实验室工作过很长时间,所以他非常熟悉 Lisp 语言的优点。Lisp 是解释性的语言,用 Lisp 开发的程序具有良好的可读性,因此将它用于处理文本编辑这样的任务是非常合适的。当然解释性的语言与硬件直接作用时其效率与编译性的语言相比则显得不高,这样的任务还是由 C 语言代码来完成比较合适。
斯托曼的一个天才构想就是利用 C 语言编写与硬件直接作用的 GNU Emacs 模块(如显示模块),而绝大多数文本编辑模块则统统利用 Lisp 语言来编写。Lisp 语言是一种功能全面的编程语言,其解释器被嵌入了 GNU Emacs 中后,用户便可以用它自行对 GNU Emacs 进行定制。这一几乎无限的灵活性是其他编辑器很难做到的。在 GNU Emacs中,Emacs的Lisp代码模块和 C 代码模块组织良好,它们相互取长补短,相得益彰。
为了保持源代码的可读性与一致性,斯托曼将 GNU Emacs 中的 C 语言代码模块的函数名写得很像 Lisp 函数名。如果不仔细研究模块底层的细节,那么实在很难将它们两者区分开。实际上,如果没有特殊的目的,作者希望你不要去辨认它们之间的区别。这样,在扩充和维护代码时,工作就会变得容易多了。经过这么一番匠心独运的安排,GNU Emacs 成为了一种“高级的、自带文档的、可定制的和可扩充的实时显示的编辑器”。难怪如此众多的自由软件开发人员整天都可以坐在计算机旁运行 GNU Emacs 而乐此不疲。
自从 GNU Emacs 问世以来,众多专家一致评价说:斯托曼的这一天才的泛对称设计思想极富艺术性,具有方法论研究的永久价值。
由于使用GNU Emacs 的开发人员数量众多,运行的平台又很广泛 ,因此各种使用GNU Emacs Lisp 编写的增强功能包也源源不断地产生了,有些功能包还成为标准GNU Emacs 发行版本的一部分。GNU Emacs 今天仍处在不断的演进和完善过程中,它代表着一种文化。这一切都是由于斯托曼当年的天才设计思想所引发的良好局面。
当然,要了解和运用这些新功能,或者自己动手开发所希望的特性来增强和扩充 GNU Emacs ,使用 GNU Emacs Lisp 编程是必不可少的,而通过本书学习编程可以说是一个良好的起点。
本书的作者,罗伯特·卡塞尔(Robert Chassell) 先生是自由软件基金会的合创人之一,也是斯托曼青年时期结交的挚友。他精通 GNU Emacs Lisp 的每一个方面。在这本编程入门著作中,他循序渐进地介绍了 GNU Emacs Lisp 编程的各种基础知识和方法,文笔流畅、讲解透彻,对GNU Emacs 用户提高对它的理解和运用帮助极大。
另外,由于各种 Lisp 解释器大同小异,因此,一旦通过这一教程理解了 GNU Emacs Lisp 的工作原理,那么你所掌握的知识和技巧对于学习其他版本的 Lisp 语言 ( 如 AutoLisp )或者现在日趋流行的Python等解释性语言也会具有触类旁通的指导意义。
这部著作的中文版是自由软件基金会中国研究院组织人员翻译的第一本 GNU自由软件文档。我们出版这一著作以及《GNU Emacs 技术手册》、《GNU Emacs Lisp 技术手册》等中文版的主要目的就在于更好地引导读者体会编写程序、分析自由软件源代码的乐趣。这对于在中国催生新的黑客具有极大的促进作用,因为我相信黑客道的真正本质就是“热爱编写程序、并享受通过编写程序而变得更加聪明这一过程”。




自由软件基金会中国研究院
洪  峰
fred@mail.rons.net.cn

图书目录

致中国读者
译者序
前言
第1章  列表处理 1
1.1  Lisp列表 1
1.1.1  Lisp原子 1
1.1.2  列表中的空格 2
1.1.3  GNU Emacs帮助你输入列表 3
1.2  运行一个程序 3
1.3  产生错误消息 4
1.4  符号名和函数定义 5
1.5  Lisp解释器 5
1.6  求值 6
1.7  变量 7
1.8  参量 8
1.8.1  参量的数据类型 9
1.8.2  作为变量和列表的值的参量 10
1.8.3  数目可变的参量 10
1.8.4  用一个错误类型的数据对象作为
      参量 10
1.8.5  message函数 11
1.9  给一个变量赋值 12
1.9.1  使用set函数 13
1.9.2  使用setq函数 13
1.9.3  计数 14
1.10  小结 15
1.11  练习 15
第2章  求值实践 16
2.1  缓冲区名 16
2.2  获得缓冲区 17
2.3  切换缓冲区 18
2.4  缓冲区大小和位点的定位 19
2.5  练习 20
第3章  如何编写函数定义 21
3.1  defun特殊表 21
3.2  安装函数定义 23
3.3  使函数成为交互函数 24
3.4  interactive函数的不同选项 25
3.5  永久地安装代码 26
3.6  let函数 27
3.6.1  let表达式的各个部分 27
3.6.2  let表达式例子 28
3.6.3  let语句中的未初始化变量 29
3.7  if特殊表 29
3.8  if-then-else表达式 31
3.9  Lisp中的真与假 32
3.10  save-excursion函数 33
3.11  回顾 35
3.12  练习 37
第4章  与缓冲区有关的函数 38
4.1  查找更多的信息 38
4.2  简化的beginning-of-buffer
    函数定义 38
4.3  make-whole-buffer函数的定义 40
4.4  append-to-buffer函数的定义 41
4.4.1  append-to-buffer函数的交互
      表达式 42
4.4.2  append-to-buffer函数体 42
4.4.3  append-to-buffer函数中
      的save-excursion 43
4.5  回顾 45
4.6  练习 46
第5章  更复杂的函数 47
5.1  copy-to-buffer函数的定义 47
5.2  insert-buffer函数的定义 48
5.2.1  insert-buffer函数中的交互
      表达式 48
5.2.2  insert-buffer函数体 49
5.2.3  用if表达式(而不是or表达式)
      编写的insert-buffer函数 49
5.2.4  函数体中的or表达式 50
5.2.5  insert-buffer函数中的let
      表达式 51
5.3  beginning-of-buffer函数的完
    整定义 52
5.3.1  可选参量 52
5.3.2  带参量的beginning-of-buffer
   函数 53
5.3.3  完整的beginning-of-buffer
   函数 55
5.4  回顾 56
5.5  &optional参量练习 57
第6章  变窄和增宽 58
6.1  save-restriction特殊表 58
6.2  what-line函数 59
6.3  练习:变窄 60
第7章  基本函数:car、cdr、cons 61
7.1  car和cdr函数 61
7.2  cons函数 63
7.3  nthcdr函数 64
7.4  setcar函数 65
7.5  setcdr函数 66
7.6  练习 67
第8章  剪切和存储文本 68
8.1  zap-to-char函数 69
8.1.1  interactive表达式 69
8.1.2  zap-to-char函数体 70
8.1.3  search-forward函数 70
8.1.4  progn函数 71
8.1.5  总结zap-to-char函数 71
8.1.6  第18版中zap-to-char函数的
      实现方法 72
8.1.7  progn表达式主体 73
8.2  kill-region函数 74
8.3  delete-region函数:接触C 75
8.4  用defvar初始化变量 76
8.5  copy-region-as-kill函数 77
8.6  回顾 82
8.7  查找练习 83
第9章  列表是如何实现的 85
第10章  找回文本 88
10.1  kill环总览 88
10.2  kill-ring-yank-pointer变量 88
10.3  练习:使用yank函数和nthcdr函数 89
第11章  循环和递归 90
11.1  while 90
11.1.1  while循环和列表 91
11.1.2  一个例子:print-elements
   -of-list 92
11.1.3  使用增量计数器的循环 93
11.1.4  使用减量计数器的循环 96
11.2  递归 98
11.2.1  使用列表的递归函数 99
11.2.2  用递归算法代替计数器 100
11.2.3  使用cond的递归例子 102
11.3  有关循环表达式的练习 102
第12章  正则表达式查询 104
12.1  查询sentence-end的正则表达式 104
12.2  re-search-forward函数 105
12.3  forward-sentence函数 106
12.4  forward-paragraph:函数的金矿 109
12.5  创建自己的“TAGS”文件 115
12.6  回顾 116
12.7  练习:使用re-search-forward 117
第13章  计数:重复和正则表达式 118
13.1  count-words-region函数 118
13.2  用递归的方法实现单词计数 123
13.3  练习:统计标点符号的数量 127
第14章  统计函数定义中的单词数 128
14.1  计数什么? 128
14.2  单词或者符号是由什么构成的? 129
14.3  count-words-in-defun函数 130
14.4  在一个文件中统计几个函数定
     义的单词数 132
14.5  查找文件 133
14.6  lengths-list-file函数详解 134
14.7  在不同文件中统计几个函数定义
     的单词数 135
14.8  在不同文件中递归地统计单词数 137
14.9  为图形显示准备数据 138
14.9.1  对列表排序 138
14.9.2  制作一个文件列表 139
第15章  准备柱型图 144
15.1  graph-body-print函数 148
15.2  recursive-graph-body-print
   函数 150
15.3  需要打印的坐标轴 151
15.4  练习 151
第16章  配置你的“.emacs”文件 152
16.1  全站点的初始化文件 152
16.2  为一项任务设置变量 153
16.3  开始改变“.emacs”文件 153
16.4  文本和自动填充模式 154
16.5  邮件别名 156
16.6  缩排模式 156
16.7  一些绑定键 156
16.8  加载文件 157
16.9  自动加载 158
16.10  一个简单的功能扩充:
      line-to-top-of-window 159
16.11  键图 161
16.12  X11的颜色 162
16.13  V19中的小技巧 163
16.14  修改模式行 163
第17章  调试 165
17.1  debug 165
17.2  debug-on-entry 166
17.3  debug-on-quit和(debug) 168
17.4  源代码级调试器edebug 168
17.5  调试练习 170
第18章  结论 171
附录A  the-the函数 173
附录B  kill环的处理 175
B.1  rotate-yank-pointer函数 175
B.2  yank函数 180
B.3  yank-pop函数 182
附录C  带坐标轴的图 184
C.1  print-graph函数的变量列表 185
C.2  print-Y-axis函数 185
C.2.1  题外话:计算余数 186
C.2.2  构造一个Y轴元素 188
C.2.3  创建Y坐标轴 189
C.2.4  print-Y-axis函数的最后形式 190
C.3  print-X-axis函数 190
C.4  打印整个图形 194
C.4.1  测试print-graph函数 197
C.4.2  绘制函数中单词和符号数的图形 198
C.4.3  打印出来的图形 202

教学资源推荐
作者: Cleve B. Moler
作者: Delores M.Etter, David C.Kuncicky, Holly Moore
参考读物推荐
作者: 邓湘榆 张智杰 陈皇仁 黄圣杰
作者: (美)Thomsa A.Stellman & G.V.Krishnan
作者: 康博创作室编著