Выполнение функции при изменении переменной.
Иногда полезно выполнить какое-то действие при изменении значения переменной. Утилита контроля переменных предоставляет средства для этого. Возможные применения включают синхронизацию отображения с настройками переменных и вызов отладчика для отслеживания неожиданных изменений переменных (см. Отладка переменных).
Для управления и запроса функций отслеживания переменных могут использоваться следующие функции.
- Функция: add-variable-watcher символ функция-наблюдатель
-
Эта функция организует вызов функция-наблюдатель всякий раз, когда символ изменяется. Изменения через псевдонимы (см. Псевдонимы переменных) будут иметь тот же эффект.
функция-наблюдатель будет вызвана непосредственно перед изменением значения символ с 4 аргументами: символ, новое значение, операция и место. символ — это изменяемая переменная. новое значение — это значение, на которое она будет изменена. (Старое значение доступно функция-наблюдатель в качестве значения символ, так как оно ещё не было изменено на новое значение.) операция — это символ, представляющий тип изменения, один из:
set,let,unlet,makunbound, илиdefvaralias. место — это буфер, если изменяется локальное значение переменной в буфере,nilв противном случае.
- Функция: remove-variable-watcher символ функция-наблюдатель
Эта функция удаляет функция-наблюдатель из списка наблюдателей символ.
- Функция: get-variable-watchers символ
Эта функция возвращает список активных функций-наблюдателей символ.
Ограничения
Существует несколько способов, которыми переменная может быть изменена (или, по крайней мере, казаться изменённой) без срабатывания точки наблюдения.
Поскольку точки наблюдения прикреплены к символам, изменение объектов, содержащихся в переменных (например, с помощью функции изменения списка, см. Изменение списков), не обнаруживается этим механизмом.
Кроме того, код C может изменять значение переменных напрямую, минуя механизм точки наблюдения.
Незначительное ограничение этой функции, опять же, из-за того, что она ориентирована на символы, заключается в том, что отслеживать можно только переменные динамического доступа. Это создаёт немного сложностей, так как изменения лексических переменных можно легко обнаружить, проверив код внутри области действия переменной (в отличие от динамических переменных, которые могут быть изменены любым кодом вообще, см. Область действия переменных).
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Watching-Variables.html