Иногда полезно сделать две переменные синонимами, чтобы обе
переменные всегда имели одинаковое значение, и изменение одной также
изменяло другую. Когда вы меняете имя переменной — потому что вы
поняли, что ее старое имя было выбрано неудачно, или потому что ее
значение частично изменилось, — может быть полезно сохранить старое
имя в качестве псевдонима нового для совместимости.
Это можно сделать с помощью defvaralias.
Эта функция определяет символ 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 объявляет, что старое имя
устарело, и поэтому его можно удалить на некотором этапе в будущем.
Эта функция заставляет компилятор байт предупредить о том, что переменная obsolete-name устарела. Если current-name является символом, это новое имя переменной; тогда сообщение о предупреждении советует использовать current-name вместо obsolete-name. Если current-name является строкой, это сообщение, и нет заменяющей переменной. when должен быть строкой, указывающей, когда переменная была впервые устарела (обычно строка с номером версии).
Необязательный аргумент access-type, если он не равен
nil, должен указывать тип доступа, который вызовет
предупреждения об устаревании; это может быть либо get,
либо set.
Вы можете сделать две переменные синонимами и объявить одну
устаревшей одновременно с помощью макроса define-obsolete-variable-alias.
Этот макрос помечает переменную 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")
Эта функция возвращает переменную в конце цепочки псевдонимов 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