12.6 Советы по надежному определению переменных

При определении переменной, значение которой является функцией или списком функций, используйте имя, оканчивающееся на ‘-function’ или ‘-functions’ соответственно.

Существуют и другие соглашения об именовании переменных; вот полный список:

‘…-hook’

Переменная является обычной хуком (см. Хуки).

‘…-function’

Значение является функцией.

‘…-functions’

Значение является списком функций.

‘…-form’

Значение является формой (выражением).

‘…-forms’

Значение является списком форм (выражений).

‘…-predicate’

Значение является предикатом — функцией с одним аргументом, которая возвращает не-nil при успехе и nil при неудаче.

‘…-flag’

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

‘…-program’

Значение является именем программы.

‘…-command’

Значение является всей командной строкой оболочки.

‘…-switches’

Значение указывает опции для команды.

‘prefix--…’

Переменная предназначена для внутреннего использования и определяется в файле prefix.el. (Код Emacs, внесенный до 2018 года, может следовать другим соглашениям, которые выводятся из употребления.)

‘…-internal’

Переменная предназначена для внутреннего использования и определяется в коде C. (Код Emacs, внесенный до 2018 года, может следовать другим соглашениям, которые выводятся из употребления.)

При определении переменной всегда учитывайте, следует ли помечать ее как безопасную или рискованную; см. Локальные переменные файла.

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

(defvar my-major-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?# "<" table)
    …
    table)
  docstring)

Этот метод имеет несколько преимуществ. Во-первых, если пользователь выходит, пока файл загружается, переменная либо все еще не инициализирована, либо инициализирована должным образом, никогда не находится в промежуточном состоянии. Если она все еще не инициализирована, повторная загрузка файла инициализирует ее должным образом. Во-вторых, повторная загрузка файла после инициализации переменной не изменит ее; это важно, если пользователь изменил ее значение. В-третьих, вычисление формы defvar с помощью C-M-x полностью переинициализирует переменную.