Преобразование программы на Emacs Lisp к лексическому связыванию выполняется легко. Сначала добавьте установку файловой локальной переменной lexical-binding в t в строке заголовка исходного файла Emacs Lisp (см. Файловые локальные переменные). Во-вторых, проверьте, что каждая переменная в программе, которая должна связываться динамически, имеет определение переменной, чтобы она случайно не была связана лексически.
Простой способ выяснить, какие переменные нуждаются в определении переменной, — это откомпилировать исходный файл в байт-код. См. Байт-компиляция. Если неспециальная переменная используется вне формы let, байт-компилятор выдаст предупреждение о ссылке или присваивании свободной переменной. Если неспециальная переменная связана, но не используется внутри формы let, байт-компилятор выдаст предупреждение о неиспользуемой лексической переменной. Байт-компилятор также выдаст предупреждение, если вы используете специальную переменную в качестве аргумента функции.
Предупреждение о ссылке или присваивании свободной переменной обычно является явным признаком того, что эта переменная должна быть помечена как динамически ограниченная, поэтому вам нужно добавить соответствующий defvar перед первым использованием этой переменной.
Предупреждение о неиспользуемой переменной может быть хорошей подсказкой, что переменная предназначалась для динамической области видимости (поскольку она фактически используется, но в другой функции), но это также может указывать на то, что переменная просто действительно не используется и ее можно просто удалить. Поэтому вам нужно выяснить, какой это случай, и, исходя из этого, либо добавить defvar, либо полностью удалить переменную. Если удаление невозможно или нежелательно (обычно потому, что это формальный аргумент и мы не можем или не хотим изменять все вызывающие функции), вы также можете добавить ведущий символ подчеркивания к имени переменной, чтобы указать компилятору, что это переменная, заведомо не используемая.)
Внимание: Это экспериментальная возможность, которая может измениться или исчезнуть без предварительного уведомления.
Байт-компилятор также может предупреждать о лексических переменных, которые являются специальными в других файлах Emacs Lisp, что часто указывает на отсутствие объявления defvar. Эта полезная, но несколько специализированная проверка требует трех шагов:
EMACS_GENERATE_DYNVARS в непустую строку. Обычно это все файлы в одном пакете или связанных пакетах, или подсистемах Emacs. Этот процесс создаст для каждого скомпилированного файла Emacs Lisp файл с именем, оканчивающимся на .dynvars.
EMACS_DYNVARS_FILE, установленной в имя объединенного файла, созданного на шаге 2.
Ниже приведен пример, иллюстрирующий, как это можно сделать, предполагая, что для байт-компиляции используются оболочка Unix и make:
$ rm *.elc # принудительная перекомпиляция $ EMACS_GENERATE_DYNVARS=1 make # создать .dynvars $ cat *.dynvars > ~/my-dynvars # объединить .dynvars $ rm *.elc # принудительная перекомпиляция $ EMACS_DYNVARS_FILE=~/my-dynvars make # выполнить проверки