Ошибки компилятора
Сообщения об ошибках и предупреждения, возникающие при байт-компиляции, выводятся в буфер с именем *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