ops はどちらのオペレーションが関心であるかを示し、そして、次のアイテムの1以上のリストです。
- array
- array命令が呼び出される時、name がスカラー変数ではない限り、その変数は
arrayコマンドによってアクセスされます、もしくは修正されるときはいつでも、commandを呼び出します。name がスカラ変数である場合、
arrayコマンド経由のアクセスは、トレースしません。
- read
- 変数が読まれるときはいつでも、commandを呼び出します。
- write
- 変数が書かれるときはいつでも、commandを呼び出します。
- unset
- 変数が設定されないときはいつでも、commandを呼び出します。変数は、
unsetコマンドによって明白にアンセットされ、もしくはプロシージャが戻る時、暗黙にアンセットされます
( それらの局所変数の全てがセットされない場合 ) 。
インタープリタが削除されるとき、変数は同じくアンセットされます、しかし、実行するインタープリタがないので、トレースは行使されません。
トレーストリガの現在のコマンドが次のとおりである場合、3つの引数は、commandに付加されます。
command name1 name2 op
Name1、及びname2は、アクセスされた変数のためにname ( s
) を与えます。その変数がその時スカラであるならば、name1は変数の名前を与え、そしてname2は空のストリングになります。その変数がその時配列要素であるならば、name1はアレイの名前を与え、そしてname2はインデックスをアレイに与えます。全体のアレイが削除されつつあり、単一のエレメントというよりはむしろ、そのトレースが全体のアレイ上で登録されたならば、name1はアレイ名前を与え、そしてname2は空のストリングになります。Name1、及びname2は、トレース変数コマンドに使われるname
として必ずしも同じであるとは限りません。upvarコマンドはプロシージャが異なるname
の下で変数を参照することを可能にします。Opは、上で定義されたように、
read、writeまたは、 unsetのいずれかの、どのようなオペレーションが変数に関して行われつつあるかを示します。
それが起動されたコードと同じコンテキストにおいて、トレースされたオペレーションのcommand実行する場合、その変数がTclプロシージャの一部としてアクセスされたなら、commandはプロシージャのコードと同じローカル変数へのアクセス権を持っています。このコンテキストは、そのトレースが作成されたコンテキストとは異なる場合もあります。commandが、その時プロシージャ (それが通常行う)
を呼び出す場合、そのプロシージャがアクセスのトレースされた変数を望むなら、
upvar、または uplevelを使わなければなりません。注意事項として、同じくそのname
がトレースを変数に置いたものと、name1が必ずしも同様であるとは限りません。そのアクセスが
upvarコマンドによって定義された変数によって行われるならば、差異は発生し得ます。
読込み、そして書込みトレースのためのcommandは、トレースされたオペレーションの結果
に影響を及ぼすために、変数を修正します。commandが読込み、もしくは書込みトレースの間に変数の値を修正する場合、新しい値はトレースされたオペレーションの結果
として返されます。それがリターンする時、同じくあらゆるソート、そしてトレースされたオペレーションのエラーがトレースコマンドによって返された同じエラーメッセージによってエラーを返すということを除けば、コマンドからのリターン値は無視されます(
例えば、このメカニズムがリードオンリー変数を実行するために使われます
) 。書込みトレースのために変数の値が、書込みオペレーションにおいて指定されたオリジナルの値をオーバライドすることで変数に新しい値に書き変えられた後で、commandは呼び出されます。リードオンリー変数でcommandを実行する場合、変数の古い値を回復しなければなりません。
commandの読み込み、もしくは書込みトレース実行中である場合、変数に関するトレースは、実行と同時に、一時的に無効にされます。これは、それが読み込み、書込みが行使されているあいだで、再びcommand( 或いは、他のトレース ) を呼び出さずに、commandは直接、動きます。 commandがアンセットをセットしないければ、トレースは起動されます。
アンセットトレースが行使されるとき、トレースなしでは定義されないように思われるでしょうが、既にその変数は削除されています。アンセットがプロシージャリターンのために発生するならば、そのトレースは、戻りさきのプロシージャのスタックフレームはもはや存在しないでしょうが、返されたプロシージャの変数コンテキストにおいて行使されます。
トレースはアンセットトレースの間には無効にされません。従って、アンセットトレースコマンドが新しいトレースを作成し、そして、変数にアクセスするなら、そのトレースは行使されるます。アンセットトレースにおけるあらゆるエラーは無視されます。
変数に関して多重トレースがあるならば、それらは、最も最近、作られた順に行使されます。1つのトレースがエラーを返した場合、それ以降のトレースは変数のために行使されません。配列要素がトレースセットを持っており、同じく全体としてアレイに置かれたトレースがあるならば、全体のアレイ上のトレースはエレメント上の1つ以前に行使されます。
いったん作成されたトレースは、そのトレースが下で述べるトレース削除variableコマンドによって除去されるまで、そのトレースが同様に有効な状態を維持すれば、その変数がアンセットされるまで、もしくはそのインタープリタが削除されるまで、残ります。アレイのエレメントをセットしないことは、あらゆるトレースをそのエレメントから除去します。しかし、トレースを全体のアレイから除去しません。