11

有人可以解释在 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))
4

3 回答 3

8

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

但是,如果您计划提供很长时间的支持并且想要进行某种备份,这就是我会做的事情(但我自己不会这样做,因为一旦损坏就修复似乎更好战术)。对于您正在使用的 CL 包中的函数,请创建一个特殊文件,其中defalias所有这些函数都有一个cl-前缀。因此,例如,(position ...)您将拥有(cl-position ...). 理论上会为您省去前向兼容性的问题。但是功能不会立即被删除,您会在它们被弃用之前收到警告,并且会有很多时间进行更新。取决于你,真的。

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

于 2012-10-29T08:07:38.433 回答
4

你读过手册的宏部分吗?使用诸如您的loop示例之类的宏是完全可以的。

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

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

于 2012-10-29T11:11:30.793 回答
4

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

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

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

于 2012-10-29T12:24:11.357 回答