12.15 Псевдонимы переменных

Иногда полезно сделать две переменные синонимами, чтобы обе переменные всегда имели одинаковое значение, и изменение одной также изменяло другую. Когда вы меняете имя переменной — потому что вы поняли, что ее старое имя было выбрано неудачно, или потому что ее значение частично изменилось, — может быть полезно сохранить старое имя в качестве псевдонима нового для совместимости. Это можно сделать с помощью defvaralias.

Функция: defvaralias new-alias base-variable &optional docstring

Эта функция определяет символ new-alias как псевдоним переменной для символа base-variable. Это означает, что получение значения new-alias возвращает значение base-variable, а изменение значения new-alias изменяет значение base-variable. Обе псевдонимизированные переменные всегда имеют одинаковое значение и одинаковые привязки.

Если аргумент docstring не равен nil, он указывает документацию для new-alias; в противном случае псевдоним получает ту же документацию, что и base-variable, если таковая имеется, если только base-variable сама не является псевдонимом, в этом случае new-alias получает документацию переменной в конце цепочки псевдонимов.

Эта функция возвращает base-variable.

Если результирующая цепочка определений переменных будет циклической, Emacs выдаст ошибку cyclic-variable-indirection.

Псевдонимы переменных удобны для замены старого имени переменной на новое. make-obsolete-variable объявляет, что старое имя устарело, и поэтому его можно удалить на некотором этапе в будущем.

Функция: make-obsolete-variable obsolete-name current-name when &optional access-type

Эта функция заставляет компилятор байт предупредить о том, что переменная obsolete-name устарела. Если current-name является символом, это новое имя переменной; тогда сообщение о предупреждении советует использовать current-name вместо obsolete-name. Если current-name является строкой, это сообщение, и нет заменяющей переменной. when должен быть строкой, указывающей, когда переменная была впервые устарела (обычно строка с номером версии).

Необязательный аргумент access-type, если он не равен nil, должен указывать тип доступа, который вызовет предупреждения об устаревании; это может быть либо get, либо set.

Вы можете сделать две переменные синонимами и объявить одну устаревшей одновременно с помощью макроса define-obsolete-variable-alias.

Макрос: define-obsolete-variable-alias obsolete-name current-name when &optional docstring

Этот макрос помечает переменную obsolete-name как устаревшую и также делает ее псевдонимом для переменной current-name. Это эквивалентно следующему:

(defvaralias obsolete-name current-name docstring)
(make-obsolete-variable obsolete-name current-name when)

Этот макрос вычисляет все свои параметры, и как obsolete-name, так и current-name должны быть символами, поэтому типичное использование будет выглядеть следующим образом:

(define-obsolete-variable-alias 'foo-thing 'bar-thing "27.1")
Функция: indirect-variable variable

Эта функция возвращает переменную в конце цепочки псевдонимов variable. Если variable не является символом или если variable не определена как псевдоним, функция возвращает variable.

(defvaralias 'foo 'bar)
(indirect-variable 'foo)
     ⇒ bar
(indirect-variable 'bar)
     ⇒ bar
(setq bar 2)
bar
     ⇒ 2
foo
     ⇒ 2
(setq foo 0)
bar
     ⇒ 0
foo
     ⇒ 0