在Emacs中,这个错误意味着什么? “警告:运行时需要cl包”

时间:2011-02-16 17:17:10

标签: emacs lisp common-lisp

我是字节编译模块。它给了我这个警告:

 Warning: cl package required at runtime

为什么这是一个警告?我很清楚我正在使用cl包。实际上模块中有一个(require 'cl)语句。

使用cl内容有什么问题吗?

如果是,是否有已发布的解决方法列表?我使用的主要内容是mapcandelete-duplicates

5 个答案:

答案 0 :(得分:26)

此警告的原因是GNU策略,它不希望在Elisp中使用包cl。但完全禁止它也是​​愚蠢的。所以他们决定发出警告。

您可以找到更多信息here

答案 1 :(得分:24)

以防万一有人在正确使用cl的过程中阅读此内容:此处所述的方法现已弃用。

至少与emacs 24相比,您应该使用cl而不是cl-lib,或者如果宏足够,则使用cl-macs。这些是cl的新版本,可以使用干净的命名空间。例如。而不是defun*你有cl-defun

cl - 包现在仅用于向后兼容,不应在新代码中使用。

答案 2 :(得分:13)

Elisp和Common Lisp之间存在命名空间冲突,但 cl 包通过在重复的名称后附加星号来绕过它们。例如,它实现了 defun 的Common Lisp版本,但称之为 defun * 。结果是 cl 和Elisp之间没有名称空间冲突,而且(需要'cl)非常安全。

如果您想摆脱愚蠢的警告,请自定义变量 byte-compiler-warnings 。[1]这将在您编译代码时关闭警告。如果您分发代码,警告可能会在其他人编译时返回。如果您不希望发生这种情况,请使用以下代码:

(with-no-warnings
   (require 'cl))

您可以以类似的方式停止有关任何Lisp表单的字节编译器警告。[2]一般来说这可能不是一个好主意,但在这种情况下你可以证明它是合理的。

代码:

(eval-when-compile
   (require 'cl))

将消除警告,但是如果执行此操作,您将只能使用包中的宏。宏在编译时进行评估,Elisp不需要在运行时了解它们。如果您只使用任何软件包中的宏,而不仅仅是 cl ,那么最好使用 eval-when-compile ,因为它会在运行时停止不必要的软件包加载时间,既节省内存又使代码更快。但在我看来,滥用功能只是为了避免警告而使用它。当然,如果您确实想要使用 cl 中的任何功能,那么无论如何都不能使用 eval-when-compile

[1]您可能需要在.emacs文件中添加(需要'bytecomp)才能访问此变量。

[2]理论上,无论如何, with-no-warnings 中存在一个错误,这意味着它不会抑制一些关于词汇变量的警告。

答案 3 :(得分:4)

Common Lisp与elisp有很多命名空间冲突,通常函数似乎做同样的事情,但在一些细微的细节上有所不同。混合这两者是一种风险,最好不要在用户背后做。因此,cl.el中的大多数更有用的函数都被定义为宏,因此cl.el只能在编译时使用,而宏只会影响在未来的Emacs会话中使用它们的代码。

答案 4 :(得分:1)

我在阅读之前的评论后无法抑制此消息。

但是,我收到了GNU emacs邮件列表上善良的人的以下指示:

需要cl-lib,然后更改调用以使用cl-remove-if-not, 而不是remove-if-not。

这被证明是补救措施。

总之:要求cl-lib,还必须更改函数/宏调用的名称。

... HTH