Маючи справу з "Попередження: присвоєння вільній змінній", коли певні бібліотеки можуть бути відсутні у дизайні


12

Байт складання мого режиму:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

попереджає:

Warning: assignment to free variable `er/try-expand-list'

Це нормальна ситуація, оскільки er/try-expand-listвизначена зовнішня; бібліотека, expand-regionяка знаходиться на веб-сайті http://elpa.gnu.org

Розширення реєстру мого режиму до expand-regionбібліотеки, але нормально запускати мій режим без expand-regionрежиму.

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

(defvar er/try-expand-list)

defvar Документи кажуть:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

Я використовую -*- lexical-binding: t -*-. Чи означає це, що без defvarзмінної er/try-expand-listбути в лексичному просторі, і я маю реальну помилку?


2
Бічна примітка: не слід цитувати символ у полі (defvar er/try-expand-list).
ЖанП'єр

@JeanPierre Виправлено.
gavenkoa

Відповіді:


10

Ні, setі setqне декларуйте лексичні змінні. Тільки letробить. Якби ви letтут не використовували, ви мали б помилку, але це добре. Попередження існує здебільшого для введення помилок друку при використанні динамічних змінних.

Щоб перешкодити, використовуйте, defvarяк у вашому питанні, але не цитуйте символ.


Перетворюється на eval-when-compileзайве до справедливого defvar? Я не бачу жодного попередження без eval-when-compile. Здається, що eval-when-compileце потрібно, якщо використовувати активний код, наприклад (require ...)...
gavenkoa

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