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

Che*_*eso 37 lisp emacs common-lisp

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

 Warning: cl package required at runtime
Run Code Online (Sandbox Code Playgroud)

为什么这是一个警告?我很清楚我正在使用这个cl包.事实上(require 'cl),模块中有一个声明.

使用这些cl东西有什么问题吗?

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

Ole*_*liv 27

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

您可以在此处找到更多信息

  • 仅供参考,我只是在查看一些代码,这些代码用`(eval-when-compile(require'cl))`明确地避免了这个警告. (4认同)
  • 不幸的是链接腐烂已经得到了答案中的文章. (2认同)

kdb*_*kdb 27

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

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

旧的包cl现在只是为了向后兼容,不应该在新代码中使用.


Ber*_*ley 13

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

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

(with-no-warnings
   (require 'cl))
Run Code Online (Sandbox Code Playgroud)

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

代码:

(eval-when-compile
   (require 'cl))
Run Code Online (Sandbox Code Playgroud)

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

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

[2]理论上,无论如何,但是在没有警告的情况下存在一个错误,这意味着它不会抑制关于词汇变量的一些警告.