BBS水木清华站∶精华区

发信人: KONG (霍犀子), 信区: Linux 
标  题: Re: [编程] 程式设计工具杂谈 
发信站: BBS 水木清华站 (Thu Dec 11 05:11:49 1997) 
 
花两个月看懂Emacs Lisp Reference Manual知道怎么编LISP程序了, 
你就什么也不愁了.那个Manual写得还是很有意思的. 
 
【 在 fuse (保险丝) 的大作中提到: 】 
 我想调试我的BBS系统,可我进了emacs差点连退都没退出去, 
 我有看那个Tutorial, 上来先教人光标移动,吓得大跳 
 这位大侠,教教我如何用emacs调程序吧! 
 (或者哪里有一些好的资料?) 
 多谢了 
        Emacs是第一个人工生命 
 
Emacs看起来像是一个其貌不扬的普通编辑器,但实际上却是个真正意义上 
的IDE(Integrated Developing Environment),和Borland,Microsoft的 
东西不同,Emacs对用户和程序员区别不大,也就是用户即程序员,程序员 
即用户.这一点是这样实现的:Emacs有一个C编的硬核,像其它C语言编的 
程序一样,这个硬核是不能轻易改变的,除非你有源码并且对系统内部有 
较深刻的了解,即使有了这些条件也必须重新make,在运行Emacs时是不能 
对这个硬核做任何代码上的修改的.安装过Emacs的人知道在安装过程中会 
生成一个temacs可执行文件,这个temacs就是完全由C实现的硬核,它实现 
的是LISP的链表解释机制和一些基本的LISP函数,比如在Emacs的 
*scratch* (涂鸦) buffer里打入: 
 
(symbol-function 'car) <Ctrl-j> 
 
系统会告诉你 
#<subr car> 
 
就是说car是个C实现的LISP函数,属于硬核的一部分,你不能改变它的函数 
定义. 
 
其实理论上说这个硬核完全可以最小化,只包含一些最最基本的函数,大概 
用汇编就能够写出来.但为portability和performance起见,这个硬核用C 
实现并包含了基本上所有的常见LISP函数.打个比方,就像逻辑运算一样, 
尽管用NOT和AND就能够表示所有的逻辑运算,平常我们还是NOT,AND,OR齐上. 
temacs里有些LISP函数其实完全可以用一些更基本的LISP函数实现,但为了 
速度,Richard Stallman还是把它们用C实现了,这样做的好处是速度快了, 
坏处看完了下面你就明白了. 
 
有了temacs,以后的事情就是在它的基础上滚雪球,不断地在temacs里eval 
LISP函数,temacs知道的越来越多,功能就会越来越强.Stallman选了几个 
最基本的package,如文件操作等等,作为标准的部件,在install时就喂给 
temacs,再把LISP可执行内存映象dump下来,这就是平常大家用的emacs了. 
同样在*scratch*里打入: 
(symbol-function 'find-file) <Ctrl-j> 
 
结果可能是 
(lambda (filename) ...............) 
这就是经过eval而被temacs吸收的LISP函数; 
 
也可能是 
#[(filename) ................] 
这是Stallman定义的一种LISP bytecode,用来提高LISP的运行效率,这种bytecode 
一般比功能等价的C代码还是要慢一些,但和LISP的文本代码是一一对应的,并且速 
度大大提高,必要时可以通过decompile恢复成LISP文本代码.猜测JAVA的bytecode 
借鉴了不少LISP bytecode的技术,JAVA可以说是一个表面上C++词法风格、实际上 
Object-oriented的type architecture加上LISP的run-time environment.JAVA 
Virtual Machine完全就是一台最新LISP Machine. 
 
言归正传,经eval而被temacs吸收的LISP函数和那种#[subr ...] C函数就不一样了, 
你可以通过eval加入一些这样的函数,也可以通过unintern去掉一些这样的函数, 
还可以现改函数定义略微增加或减少一些功能,这就把一个运行程序的部件当做一 
个数据库一样可以任意剪裁,根据具体情况随意增加或减少它的功能.就像生物的 
新陈代谢一样,汲取营养,排泄废物,所以说Emacs是个生物,唯一的遗憾是这个生 
物还是个婴儿,不会自己觅食,需要用户喂它吃那些.el文件才行. 
 
Internet上最大的.el文件库在 
ftp://archive.cis.ohio-state.edu/pub/gnu/emacs/elisp-archive/ 
用户也可以自编或改编一些现成的.el文件以实现自己需要的功能. 
 
.elc是byte-compile相应.el文件产生的byte-code文件,如何编写.el文件可参看 
Emacs的online info manuals (C-h i)的Emacs Lisp reference. 
 
用户可用load和autoload调入新的.el文件.当然调的越多Emacs就越吃内存,Emacs 
有garbage-collect函数负责回收内存,硬核里有根据情况触发garbage-collect的机 
制. 
 
用户用的一切功能都是temacs + 其eval过的所有LISP函数 + 与Emacs配合的外部命令 
(如gdb等)实现的.其中temacs里的链表解释机制是最灵魂的部分,从有LISP的那天起 
就没变过,预eval的package可由安装者指定;与Emacs配合的外部命令可以是OS里的 
任何输入输出可处理的命令,当然能像gdb那样和Emacs有所约定的更好;所eval的 
LISP函数是最灵活的部分,用户可以随心所欲地configure,当然喜欢玩傻瓜机的人还 
是离得远一点为好. 
 
XEmacs在user interface上下了不少工夫,但一般而言本人觉得那并不重要. 
 
太累了,就说这么多,如果谁有出版社扒分的路子不妨可以联系一下出本中文的 
tutorial(当然应该比Emacs自带的tutorial要有意思,那个tutorial简直是降自己的格, 
它说俺就是个编辑器,大家看看俺灵不灵.结果往往是用户觉得,呸,怎么这么难用. 
像我这样想说它两句好话的只好说是您二位都搞错了). 
 
-- 
从前的我,只会为一个目标                        而奋斗; 
现在的我,不为任何目标                        也得奋斗. 
 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: casio.csc.ncsu.] 

BBS水木清华站∶精华区