В Emacs, что означает эта ошибка? «Предупреждение: пакет cl требуется во время выполнения» - PullRequest
36 голосов
/ 16 февраля 2011

Я байт-компилирую модуль.Это дает мне предупреждение:

 Warning: cl package required at runtime

Почему это предупреждение?Мне хорошо известно, что я использую пакет cl.На самом деле в модуле есть оператор (require 'cl).

Что-то не так с использованием cl?

Если да, есть ли список опубликованных обходных путей?Основными вещами, которые я использую, являются mapcan и delete-duplicates.

Ответы [ 5 ]

26 голосов
/ 16 февраля 2011

Причиной этого предупреждения является политика GNU, которая не хочет, чтобы пакет cl использовался в Elisp. Но было бы глупо также полностью запретить это. Поэтому они решили показать предупреждение.

Вы можете найти больше информации здесь

24 голосов
/ 17 июня 2013

На всякий случай, если кто-то прочитает это в своем стремлении к правильному использованию cl: методы, описанные здесь, теперь устарели.

Как и в emacs 24, вместо cl вы должны использовать cl-lib или, если достаточно макросов, cl-macs. Это новые версии cl, которые работают с чистым пространством имен. Например. вместо defun* у вас есть cl-defun.

Старый cl -пакет теперь предназначен только для обратной совместимости и не должен использоваться в новом коде.

13 голосов
/ 12 декабря 2012

Между 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] Вам может потребоваться добавить (требуется 'bytecomp) к вашему файлу .emacs, чтобы получить доступ к этой переменной.

[2] В любом случае, теоретически, но есть ошибка в with-no-warnings это означает, что он не подавляет некоторые предупреждения о лексических переменных.

4 голосов
/ 17 февраля 2011

Common Lisp имеет много конфликтов пространства имен с elisp, часто функции, кажется, делают одно и то же, но отличаются некоторыми тонкими деталями.Смешивание этих двух факторов - это риск, который лучше не делать за спиной пользователя.По этой причине большинство наиболее полезных функций в cl.el определены как макросы, так что cl.el может потребоваться только во время компиляции, и тогда макросы будут влиять только на код, который использует их в будущих сеансах Emacs.

1 голос
/ 23 ноября 2015

Мне не удалось подавить это сообщение после прочтения комментариев перед моими.

Однако я получил следующую инструкцию от доброго человека из списка рассылки GNU emacs:

Требуется cl-lib, а затем измените вызов на использование cl-remove-if-not,вместо remove-if-not.

Что оказалось решением проблемы.

В сумме: если требуется cl-lib, необходимо также изменить имя вызова функции / макроса.

HTH ....

...