変数の値が変化したときに何らかのアクションを行えれば便利なときがあります。変数watchpoint(variable watchpoint)機能はそのための機能を提供します。この機能の有効な利用方法としては変数セッティングと表示の同期、変数への予期せぬ変更を追跡するためのデバッガの呼び出しが含まれます(変数の変更時にデバッガにエンターする。を参照)。
以下の関数は関数にたいするwatch関数の操作や問い合わせに使用できます。
この関数はsymbolが変化したときは常にwatch-functionが呼び出されるようにアレンジする。エイリアスを介した変更にも同じ効果をもつ(変数のエイリアスを参照)。
watch-functionはsymbolの値の変更直前にsymbol、newval、operation、whereという4つの引数で呼び出される。symbolは変更される変数、newvalは変更後の値(watch-functionではnewvalに変更される前なので古い値はsymbolの値で利用可能)、operationは変更の種類を表すシンボルでありset
、let
、unlet
、makunbound
、defvaralias
のいずれか。whereは変数のバッファーローカルな値が変更される場合にはバッファー、それ以外はnil
。
この関数はsymbolのwatcherリストからwatch-functionを削除する。
この関数はsymbolのアクティブなwatcher関数のリストをリターンする。
watchpointをトリガーせずに変数が変更される(または少なくとも変更されたように見える)方法がいくつかあります。
watchpointはシンボルにアタッチされるので変数内に含まれるオブジェクトの変更(リスト変更関数による変更。既存のリスト構造の変更を参照のこと)はこのメカニズムにより検出されません。
さらにCのコードはwatchpointメカニズムをバイパスして変数の値を直接変更できます。
繰り返しになりますがこれはシンボルをターゲットとするので、この機能のマイナーな制限はダイナミックなスコープをもつ変数だけをウォッチできるということです。レキシカル変数への変更は変数スコープ内のコードを調べれば容易に発見できるので、これが問題をもたらすことは稀でしょう(結局のところいかなるコードからも変更され得るダイナミック変数とは異なる。変数のバインディングのスコーピングルールを参照のこと)。