Spec-Zone.ru › Elisp

Ошибки компилятора

Сообщения об ошибках и предупреждения, возникающие при байт-компиляции, выводятся в буфер с именем *Compile-Log*. Эти сообщения содержат имена файлов и номера строк, указывающие на место возникновения проблемы. К этим сообщениям можно применять обычные команды Emacs для работы с выводом компилятора.

Если ошибка вызвана некорректным синтаксисом программы, байт-компилятор может ошибиться в определении её точного местоположения. Один из способов разобраться в проблеме — переключиться в буфер *Compiler Input*. (Имя этого буфера начинается с пробела, поэтому он не отображается в меню буферов.) Этот буфер содержит компилируемую программу, а точка показывает, насколько далеко байт-компилятор смог прочитать её; причина ошибки может находиться поблизости. Несколько советов по поиску синтаксических ошибок см. в разделе Отладка некорректного синтаксиса Lisp.

Распространённый тип предупреждений байт-компилятора — предупреждения о функциях и переменных, которые использовались, но не были определены. В таких предупреждениях указывается номер строки в конце файла, а не места использования отсутствующих функций или переменных; чтобы найти их, необходимо вручную выполнить поиск по файлу.

Если вы уверены, что предупреждение об отсутствующей функции или переменной необоснованно, есть несколько способов подавить его:

  • Можно подавить предупреждение для конкретного вызова функции func, поместив его в условие с проверкой fboundp, например:
    (if (fboundp 'func) ...(func ...)...)
    

    Вызов func должен находиться в then-form конструкции if, а func должна быть заключена в кавычки при вызове fboundp. (Эта возможность также работает для cond.)

  • Аналогично, можно подавить предупреждение для конкретного использования переменной variable, поместив его в условие с проверкой boundp:
    (if (boundp 'variable) ...variable...)
    

    Ссылка на variable должна находиться в then-form конструкции if, а variable должна быть заключена в кавычки при вызове boundp.

  • Можно сообщить компилятору, что функция определена, с помощью declare-function. См. раздел Сообщение компилятору о том, что функция определена.
  • Аналогично, можно сообщить компилятору, что переменная определена, с помощью defvar без начального значения. (Обратите внимание: это помечает переменную как специальную, то есть динамически связанную, но только в пределах текущей лексической области или файла, если объявление находится на верхнем уровне.) См. раздел Определение глобальных переменных.

Также можно подавлять предупреждения компилятора внутри определённого выражения с помощью макроса with-suppressed-warnings:

Специальная форма: with-suppressed-warnings warnings body…

При выполнении эта форма эквивалентна (progn body...), однако компилятор не выдаёт предупреждения об указанных условиях в body. warnings — это ассоциативный список символов предупреждений и символов функций/переменных, к которым они относятся. Например, если вы хотите вызвать устаревшую функцию с именем foo, но подавить предупреждение компиляции, напишите:

(with-suppressed-warnings ((obsolete foo))
  (foo ...))

Для более широкого подавления предупреждений компилятора можно использовать конструкцию with-no-warnings:

Специальная форма: with-no-warnings body…

При выполнении эта форма эквивалентна (progn body...), однако компилятор не выдаёт предупреждения ни о чём, что находится внутри body.

Мы рекомендуем вместо этого использовать with-suppressed-warnings, но если вы используете данную конструкцию, ограничьте её минимально возможным участком кода, чтобы не пропустить другие потенциальные предупреждения, кроме того, которое вы намерены подавить.

Предупреждения байт-компилятора можно контролировать более точно, задав переменную byte-compile-warnings. Подробности см. в её строке документации.

Иногда может потребоваться, чтобы предупреждения байт-компилятора выводились с помощью error. В этом случае задайте для byte-compile-error-on-warn значение, отличное от nil.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Compiler-Errors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API