Next: , Previous: , Up: Variables   [Contents][Index]


12.9 変数が変更されたときに実行される関数。

変数の値が変化したときに何らかのアクションを行えれば便利なときがあります。watchpoint機能はそのための機能を提供します。この機能の有効な利用方法としては変数セッティングと表示の同期、変数への予期せぬ変更を追跡するためのデバッガの呼び出しが含まれます(Variable Debuggingを参照)。

以下の関数は関数にたいするwatch関数の操作や問い合わせに使用できます。

Function: add-variable-watcher symbol watch-function

この関数はsymbolが変化したときは常にwatch-functionが呼び出されるようにアレンジする。エイリアスを介した変更にも同じ効果をもつ(Variable Aliasesを参照)。

watch-functionは4つの引数で呼び出される(symbol newval operation where)。

symbolは変更された変数、newvalは変更される新しい値、operationは変更の種別を表すシンボルであり‘set’、‘let’、‘unlet’、‘makunbound’、‘defvaralias’のいずれか。whereはその変数のバッファーローカル値が変更された場合にはバッファー、それ以外ならnil

Function: remove-variable-watch symbol watch-function

この関数はsymbolのwatcherリストからwatch-functionを削除する。

Function: get-variable-watchers symbol

この関数はsymbolのアクティブなwatcher関数のリストをリターンする。

12.9.1 制限

watchpointをトリガーせずに変数が変更される(または少なくとも変更されたように見える)方法がいくつかあります。

watchpointはシンボルにアタッチされるので変数内に含まれるオブジェクトの変更(リスト変更関数による変更。Modifying Listsを参照のこと)はこのメカニズムにより検出されません。

さらにCのコードはwatchpointメカニズムをバイパスして変数の値を直接変更できます。

繰り返しになりますがこれはシンボルをターゲットとするので、この機能のマイナーな制限はダイナミックなスコープをもつ変数だけをウォッチできるということです。レキシカル変数への変更は変数スコープ内のコードを調べれば容易に発見できるので、これが問題をもたらすことは稀でしょう(結局のところいかなるコードからも変更され得るダイナミック変数とは異なる。Variable Scopingを参照のこと)。