我如何在elisp中最好地使用common-lisp(如果有的话)?

时间:2012-10-29 05:13:05

标签: emacs lisp elisp common-lisp

有人可以解释一下使用elisp中cl包的具体问题吗?作为emacs中的一个新编码器,我觉得好像我在达到(require'cl)选项时犯了一个错误。我已经阅读并理解了cl包的字节编译问题。我看过旧的论点,不想重振它们。我也不是在寻找关于common-lisp是否优于x品牌lisp的通才评论。

我想知道的是几乎如何使用common-lisp,这样我写的任何elisp都很有可能被大多数elisp程序员接受。具体来说,我是否应该完全避免使用普通的lisp,或者是否有一些语言的某些部分可供所有人接受,而某些部分是绝大多数编码人员会窃听和嘲笑的?

不希望限制答案的广度,是这样的:

(mapcar (lambda(x) (* x x)) '(1 2 3))

比这更可接受:

(require 'cl)
(loop for el in '(1 2 3) collect (* el el))

3 个答案:

答案 0 :(得分:8)

在使用大量第三方库并编写自己的一些eLisp代码时,我从未遇到过使用CL包导致名称冲突的情况。所以,我很想说反对使用CL的论点只不过是清教主义(在原始意义上,并不意味着事物的宗教方面)。

但是,如果你计划很长一段时间的支持而你想要某种备份,这就是我要做的事情(但我自己也不这样做,因为一旦它们被破坏修复它们似乎是一个更好的策略)。对于您正在使用的CL包中的函数,请创建一个特殊文件,其中defalias所有文件都具有cl-前缀。因此,举例来说,不是(position ...),而是拥有(cl-position ...)。从理论上讲,它将为您节省向前兼容性的问题。但是,函数不会立即被删除,您将在它们被弃用之前得到警告,并且将有大量时间进行更新。真的,由你决定。

Common Lisp中的循环宏本身就是一个争议,它不是语言的典型构造,这就是为什么,例如迭代库存在的原因。它还要求你学习“循环迷你语言”以便很好地使用它,这是一种特定于领域的小语言,并且实际上并不要求这种构造使用它。但是,循环有其强大的一面。列表处理函数(例如mapcarreduce)将在更简单的情况下为您提供良好的服务,例如您的示例中的情况,但在不太重要的情况下,loop将是一个做同样事情的更好也更简洁的方式。

答案 1 :(得分:4)

您是否阅读过本手册的宏section?使用诸如loop示例之类的宏是完全可以的。

但你会在要求周围使用eval-when-compile

事实上,{E-1}在我的Emacs中的根lisp文件夹中出现了66次。

答案 2 :(得分:4)

除非您计划将代码集成到Emacs中,否则请使用CL包,并将此代码段放在.emacs中以禁用警告。

(byte-compile-disable-warning 'cl-functions)

注意:您可以在nicferrier's blog上找到有关elisp编程的一些建议。