Запуск функции при изменении переменной.
Иногда полезно выполнить какое-либо действие при изменении значения переменной. Механизм наблюдения за переменной позволяет это сделать. Возможные варианты использования этой возможности включают синхронизацию отображения с настройками переменных и вызов отладчика для отслеживания неожиданных изменений переменных (см. Вход в отладчик при изменении переменной).
Для управления функциями наблюдения за переменной и получения сведений о них можно использовать следующие функции.
- Функция: add-variable-watcher symbol watch-function
-
Эта функция настраивает вызов watch-function при каждом изменении symbol. Изменения через псевдонимы (см. Псевдонимы переменных) также будут вызывать эту функцию.
Функция watch-function будет вызвана непосредственно перед изменением значения symbol и получит 4 аргумента: symbol, newval, operation и where. symbol — это изменяемая переменная. newval — значение, на которое она будет изменена. (Старое значение доступно функции watch-function как значение symbol, поскольку оно ещё не было заменено на newval.) operation — это символ, представляющий тип изменения:
set,let,unlet,makunboundилиdefvaralias. where — это буфер, если изменяется буферно-локальное значение переменной, иnilв противном случае.
- Функция: remove-variable-watcher symbol watch-function
Эта функция удаляет watch-function из списка функций наблюдения за symbol.
- Функция: get-variable-watchers symbol
Эта функция возвращает список активных функций наблюдения за symbol.
Ограничения
Есть несколько способов изменить переменную (или создать видимость её изменения), не вызвав контрольную точку наблюдения.
Поскольку контрольные точки наблюдения привязаны к символам, этот механизм не обнаруживает изменения объектов, содержащихся в переменных (например, вызванные функцией изменения списка; см. Изменение существующей структуры списка).
Кроме того, код на C может напрямую изменять значения переменных, обходя механизм контрольных точек наблюдения.
Небольшое ограничение этой возможности, также обусловленное тем, что она работает с символами, состоит в том, что наблюдать можно только за переменными с динамической областью видимости. Это не представляет особых трудностей, поскольку изменения лексических переменных можно легко обнаружить, изучив код в области видимости переменной (в отличие от динамических переменных, которые может изменять любой код; см. Правила области видимости привязок переменных).
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/Watching-Variables.html