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


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

我想知道的是几乎如何使用common-lisp,这样我写的任何elisp都有很大机会被大多数elisp编码器接受。具体来说,我是否应该完全避免使用普通的口齿不清,或者是否有一些语言的某些部分是可以接受的,而且某些部分的大多数编码人员会嗤之以鼻地嘲笑?

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

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

比这更可接受:

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

4726
2017-10-29 05:13


起源

从不喜欢common-lisp的人那里得到一些评论会很棒(或者可能没有任何东西,并且神话被破坏了)。 - tony day
CL包不是Common-Lisp,所以你可以喜欢一个而不喜欢另一个。我喜欢CL软件包提供的许多部分,但是由于各种原因,还有其他部分存在问题。新的 cl-lib Emacs-24.3中的库清理命名空间,这样我们就不需要关心了 cl-lib 是好还是不好。 CL的一部分我不喜欢与Common-Lisp的功能有关,这些功能不适合“简单的解释器”实现,因此它们可能导致意外的性能成本。 (加上一些实现有缺陷的功能) - Stefan


答案:


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

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

Common Lisp中的循环宏本身就是一个争议,它不是语言的典型构造,这就是为什么,例如,迭代库存在的原因。它还要求你学习“循环迷你语言”以便很好地使用它,这是一种特定于领域的小语言,并且实际上并不要求这种构造使用它。但是,循环有其强大的一面。列表处理功能如 mapcar 要么 reduce 会在更琐碎的案件中为你服务,就像你在你的例子中所拥有的那样,但在不那么微不足道的情况下 loop 做同样的事情将是一种更好,也更简洁的方式。


8
2017-10-29 08:07





你读过宏吗? 部分 手册?使用你的宏等 loop 例子是完全可以的。

但你会用 eval-when-compile 围绕要求。

事实上 (eval-when-compile (require 'cl)) 在我的Emacs中的根lisp文件夹中出现66次。


4
2017-10-29 11:11



是的我已阅读宏部分,并查看了包中的一些宏代码。当我发现问题时,我还在等待那个“啊哈”时刻 需求 宏观解决方案。 - tony day
没问题 需求 宏观解决方案。使用宏可以简化很多。这是一个clojure示例而不是elisp,但我编写了一个宏来提取java类的所有静态字段,并在我自己的命名空间中公开它。没有宏的'解决方案'将是逐个编写绑定... - Cubic


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

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

注意:您可以在elisp编程上找到一些建议 nicferrier的博客


4
2017-10-29 12:24