変数の値が変更された際に、何らかの処理を行うことが有用な場合があります。変数ウォッチポイント機能は、そのための手段を提供します。この機能の活用例としては、表示を変数の設定と同期させたり、デバッガを呼び出して変数への予期しない変更を追跡したりすることなどが挙げられます(変数が変更された際にデバッガに入るを参照)。
変数のウォッチ関数を操作・照会するには、以下の関数を使用できます。
この関数は、symbol が変更されるたびに watch-function が呼び出されるようにします。エイリアス(変数エイリアス を参照)による変更でも、同様の効果が得られます。
watch-function は、symbol
の値を変更する直前に、symbol、newval、operation、where の 4
つの引数とともに呼び出されます。symbol は変更対象の変数です。newval は変更後の値です。(元の値は、まだ newval
に変更されていないため、symbol の値として watch-function から参照可能です。)operation
は変更の種類を表すシンボルで、set、let、unlet、makunbound、defvaralias
のいずれかです。where は、変数のバッファローカルな値が変更される場合はバッファ、それ以外の場合は
nil となります。
この関数は、symbolのウォッチャーリストからwatch-functionを削除します。
この関数は、symbolのアクティブなウォッチャー関数の一覧を返します。
ウォッチポイントをトリガーせずに、変数を変更(あるいは少なくとも変更されたように見せ)る方法がいくつかあります。
ウォッチポイントはシンボルに紐付いているため、変数に含まれるオブジェクトへの変更(例:リスト変更関数による変更。既存のリスト構造の変更を参照)は、この仕組みでは検知されません。
さらに、C言語のコードではウォッチポイント機構を介さずに、変数の値を直接変更できます。
この機能のわずかな制限として、やはりシンボルを対象としているがゆえに、動的スコープの変数のみが監視可能であるという点が挙げられます。レキシカル変数への変更は、その変数のスコープ内のコードを検査することで容易に検出できるため、この点はほとんど問題になりません(あらゆるコードによって変更され得る動的変数とは異なります。詳細は変数束縛のスコープ規則を参照してください)。