Подтвердить что ты не робот

В Emacs, что означает эта ошибка? "Предупреждение: пакет cl требуется во время выполнения"

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

 Warning: cl package required at runtime

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

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

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

4b9b3361

Ответ 1

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

Вы можете найти дополнительную информацию здесь

Ответ 2

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

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

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

Ответ 3

Существуют конфликты пространства имен между Elisp и Common Lisp, но пакет cl обходит их, добавляя звездочку к повторяющимся именам. Например, он реализует общую Lisp версию defun, но называет ее 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] Вам может потребоваться добавить (требуется 'bytecomp) в файл .emacs, чтобы получить доступ к этой переменной.

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

Ответ 4

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

Ответ 5

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

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

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

Это оказалось лекарством.

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

НТН....