12.9 Выполнение функции при изменении переменной.

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

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

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

12.9.1 Ограничения

Существует несколько способов, которыми переменная может быть изменена (или по крайней мере показаться измененной) без срабатывания точки наблюдения.

Поскольку точки наблюдения привязаны к символам, изменение объектов, содержащихся в переменных (например, с помощью функции изменения списка см. Изменение существующей структуры списка), не отлавливается этим механизмом.

Кроме того, код на C может напрямую изменять значение переменных, обходя механизм точек наблюдения.

Небольшое ограничение этой функции, опять же из-за того, что она нацелена на символы, заключается в том, что можно наблюдать только за переменными динамической области видимости. Это не представляет большой проблемы, поскольку изменения лексических переменных легко обнаружить путем инспекции кода в области видимости переменной (в отличие от динамических переменных, которые могут быть изменены любым кодом, см. Правила области видимости при привязке переменных).