12.9 变量改变时运行函数

有时在变量的值发生改变时执行某些操作会很有用。变量监视点(variable watchpoint) 机制就提供了这样的功能。该特性的常见用途包括:让显示内容与变量设置保持同步,以及调用调试器追踪变量的意外修改(see 修改变量时进入调试器)。

以下函数可用于管理和查询变量的监视函数。

Function: add-variable-watcher symbol watch-function

该函数会设定:每当 symbol 被修改时,就调用 watch-function。通过变量别名进行的修改也会触发同样效果(see 变量别名)。

watch-function 会在即将修改 symbol 的值之前被调用,并传入 4 个参数:symbolnewvaloperationwheresymbol 是正在被修改的变量。newval 是变量即将被设置成的新值。(旧值此时仍然可以通过 symbol 本身获取,因为它还没有被更新为 newval。) operation 是一个符号,表示修改的类型,为下列之一:setletunletmakunbounddefvaralias。 如果修改的是变量的缓冲区局部值,where 为对应的缓冲区;否则为 nil

Function: remove-variable-watcher symbol watch-function

该函数会将 watch-functionsymbol 的监视函数列表中移除。

Function: get-variable-watchers symbol

该函数返回 symbol 已激活的监视函数列表。

12.9.1 Limitations

有几种方式可以修改变量(或至少看起来被修改),但不会触发监视点。

由于监视点是附加在符号上的,因此对变量内部包含的对象进行修改(例如通过列表修改函数,see 修改已有列表结构)不会被该机制捕获。

此外,C 代码可以直接修改变量的值,绕过监视点机制。

该功能的一个小局限同样源于它基于符号:只有动态作用域的变量可以被监视。这通常不会带来太大问题,因为对词法变量的修改可以很容易地通过检查变量作用域内的代码来发现(而动态变量则可能被任意代码修改,see Scoping 变量绑定的作用域规则)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike