подавить предупреждение: присвоение свободной переменной (и другим)

14

Как я могу подавить предупреждение "присваивание свободной переменной" при байтовой компиляции файла lisp emacs?

Я на самом деле в основном заинтересован в подавлении его для определенного буфера при использовании flycheck, но я понимаю, что это просто передаётся байтовому компилятору.

Также было бы хорошо получить список всех предупреждений / ошибок, которые могут быть подавлены.

ОБНОВЛЕНИЕ :
ради полноты позвольте мне пояснить, что есть много (не зависящих от языка) причин для отключения предупреждений компилятора. Некоторые примеры: для облегчения перехода от унаследованного кода в платформу с принудительным использованием lint, для «чистых» файлов и рецептов, запускаемых в реальном контексте, для устранения шума при исправлении проблем с более высоким приоритетом или из-за неправильного компилятора.

fommil
источник
1
Не подавляйте эти предупреждения, исправьте их. Они существуют по причине.
lunaryorn
2
@lunaryorn нет, они ложные срабатывания.
Фоммил
1
При всем уважении и без ознакомления с конкретными предупреждениями я бы не согласился. Ложных предупреждений о свободных переменных очень мало, и если они появляются в таком количестве, которое заставило бы их замолчать, мне трудно поверить, что все они являются ложными срабатываниями. Я сильно подозреваю, что эти предупреждения указывают на отсутствие defvarили отсутствие requires.
lunaryorn
3
Извините, но на какие "ссылки" вы ссылаетесь?
lunaryorn
4
Когда вы решаете, что «компилятор просто неправ», правильным способом сделать это предупреждение будет объявить проблемную переменную с помощью (defvar the-variable). Это заставляет замолчать предупреждение только для этой переменной, так что вы все равно можете получить его для других переменных.
Малабарба

Ответы:

17

В интересах прибывающих сюда невежественных читателей, позвольте мне сделать небольшое отступление, чтобы сказать, что эти предупреждения обычно указывают на реальные проблемы с кодом (а если их нет, вы можете подавлять их для каждой переменной), поэтому люди должны исследовать, что они значит, прежде чем отключить их.

Конечно, я не сомневаюсь, что вы знаете, почему вам нужно отключить его, поэтому ответ ниже.


Ответ

Чтобы отключить это (или другое) предупреждение, вам нужно установить значение byte-compile-warnings. Вы можете сделать это как локальную переменную файла, добавив следующий фрагмент в конец файла.

;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End:

Вы также можете установить это глобально.

Вы можете заменить (not free-vars)с (not free-vars callargs unresolved)и в зависимости от того других предупреждений вы хотите подавить. Полный список предупреждений, которые могут быть включены / подавлены, находится в строке документации переменной (ниже).

byte-compile-warnings is a variable defined in `bytecomp.el'.
Its value is t

  This variable is safe as a file local variable if its value
  satisfies the predicate which is a byte-compiled expression.

Documentation:
List of warnings that the byte-compiler should issue (t for all).

Elements of the list may be:

  free-vars   references to variables not in the current lexical scope.
  unresolved  calls to unknown functions.
  callargs    function calls with args that don't match the definition.
  redefine    function name redefined from a macro to ordinary function or vice
              versa, or redefined to take a different number of arguments.
  obsolete    obsolete variables and functions.
  noruntime   functions that may not be defined at runtime (typically
              defined only under `eval-when-compile').
  cl-functions    calls to runtime functions (as distinguished from macros and
                  aliases) from the old CL package (not the newer cl-lib).
  interactive-only
          commands that normally shouldn't be called from Lisp code.
  lexical     global/dynamic variables lacking a prefix.
  make-local  calls to make-variable-buffer-local that may be incorrect.
  mapcar      mapcar called for effect.
  constants   let-binding of, or assignment to, constants/nonvariables.
  suspicious  constructs that usually don't do what the coder wanted.

If the list begins with `not', then the remaining elements specify warnings to
suppress.  For example, (not mapcar) will suppress warnings about mapcar.
Malabarba
источник
Обратите внимание, что Flycheck не передает глобальную настройку для этой переменной в подпроцесс байтового компилятора. Я даже не уверен, оценивает ли он локальную переменную.
lunaryorn
2
@lunaryorn Я думаю, что версия local-var должна работать с flycheck. По крайней мере, байт-компилятор обычно заботится о чтении локальных переменных перед компиляцией файла.
Малабарба
5
@fommil Извините, я не хотел покровительствовать. Я написал этот абзац, потому что другие люди могли бы приземлиться здесь, когда они гуглили это предупреждение, и я хотел, чтобы они знали, что это реально (а не просто то, что они должны немедленно отключить). Дело не в чистоте, а в правильности (код имеет другое значение без defvar). Поскольку вы не упомянули, почему вы хотите отключить его, я подумал, что стоит упомянуть, что это не должен быть первый вариант.
Малабарба
6
@fommil Ваш вопрос не содержит ссылок на более конкретный вариант использования. Он читается как общий вопрос, и, как таковой, указывая на то, что обычно (но не обязательно конкретно в вашем случае) не очень хорошая идея отключить все предупреждения, это должно быть частью любого полного ответа об отключении предупреждений, не так ли ? Вы не единственный, кто читает этот ответ, и вы не можете ожидать, что вам дадут конкретный ответ о ваших конкретных потребностях, если вы не включите их в свой вопрос.
lunaryorn
1
@fommil Я перефразировал этот первый абзац, чтобы, надеюсь, читать лучше. Дайте мне знать, что вы думаете.
Малабарба