Spec-Zone.ru › Elisp

Запуск функции при изменении переменной.

Иногда полезно выполнить какое-либо действие при изменении значения переменной. Механизм наблюдения за переменной позволяет это сделать. Возможные варианты использования этой возможности включают синхронизацию отображения с настройками переменных и вызов отладчика для отслеживания неожиданных изменений переменных (см. Вход в отладчик при изменении переменной).

Для управления функциями наблюдения за переменной и получения сведений о них можно использовать следующие функции.

Функция: 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

Spec-Zone.ru

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