Spec-Zone.ru › Elisp

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

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

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

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

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

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

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

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

    Ссылка на variable должна быть в then-форме 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-2022 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