Spec-Zone.ru › Elisp

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

Если вы определяете переменную, значением которой является функция или список функций, используйте имя, оканчивающееся соответственно на ‘-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 полностью переинициализирует переменную.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Tips-for-Defining.html

Spec-Zone.ru

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