При загрузке файла Emacs Lisp или при вычислении буфера Lisp диалект Lisp выбирается с помощью локальной для буфера переменной
lexical-binding.
Если эта локальная для буфера переменная не равна nil, файлы и буферы Emacs Lisp вычисляются с использованием современного диалекта Lisp, который по умолчанию использует лексическое связывание вместо динамического связывания. Если она равна nil, используется старый диалект, который использует динамическое связывание для всех локальных переменных. Эта переменная обычно устанавливается для всего файла Emacs Lisp как локальная для файла переменная (см. Локальные переменные файла). Обратите внимание, что, в отличие от других подобных переменных, эта должна быть установлена в первой строке файла.
На практике выбор диалекта означает, что первая строка в файле Emacs Lisp выглядит следующим образом:
;;; ... -*- lexical-binding: t -*-
для современного диалекта с лексическим связыванием, и
;;; ... -*- lexical-binding: nil -*-
для старого диалекта, использующего только динамическое связывание. Если декларация отсутствует, используется старый диалект, но это может измениться в будущих версиях. Компилятор выдаст предупреждение, если декларация отсутствует.
При прямом вычислении кода Emacs Lisp с использованием вызова eval лексическое связывание включено, если аргумент lexical для eval не равен nil. См. Eval.
Лексическое связывание также включено в режиме Lisp Interaction и IELM, используемых в буферах *scratch* и *ielm*, а также при вычислении выражений через M-: (eval-expression) и при обработке опций командной строки --eval Emacs (см. Action Arguments в The GNU Emacs Manual) и emacsclient (см. emacsclient Options в The GNU Emacs Manual).