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

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

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

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

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

Вы также можете подавить предупреждения компилятора в определенном выражении, используя макрос 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.