придушити попередження: присвоєння вільній змінній (та ін.)


14

Як я можу придушити попередження "присвоєння безкоштовній змінній" під час байта, збираючи файл emacs lisp?

Мені насправді в основному цікаво придушити його для певного буфера при використанні флешек, але я розумію, що це просто перехід до компілятора байтів.

Також було б добре отримати список усіх попереджень / помилок, які можна придушити.

ОНОВЛЕННЯ :
Для повноти дозвольте мені уточнити, що є багато (мовних агностиків) причин відключення попереджень компілятора. Деякі приклади: полегшити перехід застарілого коду в рамку, на яку поширюється вказівка, для того, щоб файли подряпин та рецепти запускалися в реальному контексті, щоб видалити шум під час виправлення проблем з вищими пріоритетами або тому, що компілятор просто не так.


1
Не придушуйте ці попередження, виправляйте їх. Вони існують не просто так.
місячник

2
@lunaryorn ні, вони неправдиві.
fommil

1
При всій повазі та, не бачачи конкретних попереджень, я не погодився б. Неправдивих безкоштовних попереджень про змінну дуже мало, і якщо вони трапляються в такій кількості, яка змусить вас замовкнути, мені важко повірити, що всі вони є помилковими позитивами. Я сильно підозрюю, що ці попередження вказують на відсутні defvarабо requires.
місячник

3
Вибачте, але на які "пов'язані посилання" ви посилаєтесь?
місячник

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.

Зауважте, що Flycheck не пересилає глобальний параметр для цієї змінної в підпроцес компілятора байтів. Я навіть не впевнений, чи оцінює вона локальну змінну.
місячник

2
@lunaryorn Я думаю, що локальна версія Var повинна працювати з флеш-контролем. Принаймні, байт-компілятор зазвичай дбає читати локальні змінні перед тим, як компілювати файл.
Малабарба

5
@fommil Вибачте, я не хотів прозвучати покровительствуюче. Я написав цей абзац, тому що інші люди можуть приземлитися тут, коли вони переглядають це попередження, і я хотів, щоб вони знали, що це справжня річ (а не просто те, що вони повинні негайно відключити). Йдеться не про чистоту, а про коректність (код має інше значення без дефавару). Оскільки ви не згадали, чому ви хочете його відключити, я подумав, що варто згадати, що це не повинно бути першим варіантом.
Малабарба

6
@fommil Ваше запитання не містить посилань на більш конкретний випадок використання. Він читається як загальне питання, і як таке, вказуючи на те, що загалом (але не обов'язково конкретно у вашому випадку) не дуже гарна ідея відключення всіх попереджень повинна бути частиною будь-якої повної відповіді про відключення попереджень, чи не так? ? Ви не єдиний, хто читає цю відповідь, і ви не можете очікувати, що вам дадуть конкретну відповідь про ваші конкретні потреби, якщо ви не включите їх у своє запитання.
місячник

1
@fommil Я переробив цей перший абзац, щоб сподіватися прочитати трохи краще. Дайте мені знати, що ви думаєте.
Малабарба
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.