【问题标题】:In Emacs, what does this error mean? "Warning: cl package required at runtime"在 Emacs 中,这个错误是什么意思? “警告:运行时需要 cl 包”
【发布时间】:2011-02-16 17:17:09
【问题描述】:

我正在对模块进行字节编译。它给了我这个警告:

 Warning: cl package required at runtime

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

使用cl 有什么问题吗?

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

【问题讨论】:

    标签: emacs lisp common-lisp


    【解决方案1】:

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

    您可以找到更多信息here

    【讨论】:

    • 感谢张贴大卫的文章。我希望将来 cl 政策会有所改变。
    • 感谢您发布此内容,但我仍然不明白为什么 GNU 不希望在 Elisp 中使用 cl.el。我读了一遍又一遍,但我没有看到任何理由。只有我一个人迷茫吗?我想我会考虑删除对 cl.el 的依赖,以消除警告,但我仍然想知道为什么我需要这样做。
    • 仅供参考,我只是在查看一些使用(eval-when-compile (require 'cl)) 明确避免此警告的代码。
    • @phils: (eval-when-compile (require 'cl)) 仅在您需要的 cl 功能位于宏中时才有效。
    • 不幸的是,链接腐烂已经到了答案中的文章。
    【解决方案2】:

    以防万一有人在寻求正确使用 cl 时阅读此内容:此处描述的方法现已弃用。

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

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

    【讨论】:

    【解决方案3】:

    Elisp 和 Common Lisp 之间存在命名空间冲突,但 cl 包通过在重复名称后附加星号来绕过它们。例如,它实现了 defun 的 Common Lisp 版本,但将其称为 defun*。结果是 cl 和 Elisp 之间没有命名空间冲突,并且 (require '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] 您可能需要将 (require 'bytecomp) 添加到您的 .emacs 文件中才能访问此变量。

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      在阅读了我之前的 cmets 后,我无法隐藏此消息。

      但是,我从 GNU emacs 邮件列表中的一位好心人那里收到了以下指示:

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

      这被证明是补救措施。

      总而言之:通过'需要 cl-lib,还必须更改函数/宏调用的名称。

      HTH....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2011-09-25
        • 2012-02-20
        • 2020-05-12
        相关资源
        最近更新 更多