断断续续地在看Emacs Lisp Reference Manual,卡在Macros一节下不去了,把Macros、Byte Compilation和Evaluation三节反反复复看了好几遍,终于弄明白了,原来此Macro非彼Macro,和C里面的宏完全是两码事。
Emacs Lisp
里的Macro实际上是Code Generator,和C里面的文本替换完全不同,即Emacs Lisp Macro是一段可以执行的Lisp程序,其执行结果并非是一般的值,而是另一段可以执行的Lisp程序。所以,一个宏调用实际上包含两段Emacs Lisp程序的执行过程,首先调用宏,生成一段新的Lisp程序,再来执行这段新生成的代码。第一个阶段就是所谓的宏替换,Byte Compilation则只做第一阶段,而不去执行新生成的代码。
说穿了不过是一层窗户纸,可不明白的时候才叫郁闷呢。所以说,如果质量可以保证的话,有人教要比自己看书效率高的多,因为可以交互,不懂就问,而写书的人只能猜测读者的问题,比如我在这里就把我觉得容易忽略的词用了粗体,这些词正是我在读Emacs Lisp Reference Manual时忽略的。
说到这再跑两句题。最近在看苏福忠著的《译事余墨》,其中谈到英译汉的主要问题在于是否弄懂原文的意思,很可能一字一句都有玄机,稍有疏忽就会“差之毫厘、谬以千里”。联系到自己学Emacs Lisp Macro这么费劲,问题也全出在阅读理解上,这才意识到自己这点英语水平还远远不够,与其每次都浪费时间反复阅读,不如索性下点苦功夫提高英文水平。自从过了六级就没再认真学过英语,这回又有动力了。
宏在好多编辑器里面都有支持,比如word、editplus、utraedit等等。作用和文中的解释差不多