Spec-Zone.ru › Elisp

Преобразование в лексическую привязку

Преобразование программы Emacs Lisp в лексическую привязку просто. Во-первых, добавьте в заголовке файла исходного кода Emacs Lisp настройку переменной lexical-binding в t (см. Локальные переменные файла). Во-вторых, проверьте, что каждая переменная в программе, которая должна быть динамически связана, имеет определение переменной, чтобы она не была случайно связана лексически.

Простой способ узнать, какие переменные нуждаются в определении переменной, — это байткодировать исходный файл. См. Байткодирование. Если переменная, не являющаяся специальной, используется вне формы let, байткодировщик выдаст предупреждение о ссылке или присваивании свободной переменной. Если переменная, не являющаяся специальной, связана, но не используется внутри формы let, байткодировщик выдаст предупреждение об отсутствии использования лексической переменной. Байткодировщик также выдаст предупреждение, если вы используете специальную переменную в качестве аргумента функции.

Предупреждение о ссылке или присваивании свободной переменной, как правило, является явным признаком того, что эта переменная должна быть помечена как динамически сфокусированная, поэтому вам нужно добавить соответствующую defvar перед первым использованием этой переменной.

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

Проверка переменных в разных файлах

Внимание: Это экспериментальная функция, которая может быть изменена или удалена без предварительного уведомления.

Байткодировщик также может предупреждать о лексических переменных, которые являются специальными в других файлах Emacs Lisp, часто указывая на отсутствие объявления defvar. Эта полезная, но несколько специализированная проверка требует трех шагов:

  1. Байткодируйте все файлы, объявления специальных переменных которых могут представлять интерес, установив переменную среды EMACS_GENERATE_DYNVARS на непустую строку. Обычно это все файлы в одном пакете или связанных пакетах или подсистемах Emacs. Процесс создаст файл с именем, заканчивающимся .dynvars, для каждого скомпилированного файла Emacs Lisp.
  2. Объедините файлы .dynvars в один файл.
  3. Байткодируйте файлы, которые необходимо проверить, на этот раз установив переменную среды EMACS_DYNVARS_FILE на имя объединенного файла, созданного на шаге 2.

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

$ rm *.elc                                # force recompilation
$ EMACS_GENERATE_DYNVARS=1 make           # generate .dynvars
$ cat *.dynvars > ~/my-dynvars            # combine .dynvars
$ rm *.elc                                # force recompilation
$ EMACS_DYNVARS_FILE=~/my-dynvars make    # perform checks

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Converting-to-Lexical-Binding.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API