DynamicModuleのスコープ
DynamicModuleは語彙スコーピングの構文となることを意図している.つまりDynamicModuleの変数は,DynamicModuleのボディに文字通り現れる変数のインスタンスだけをスコープするのである.これはModuleの動作に似ている.例えば以下の入力を見てみよう.
シンボル x はDynamicModuleによってスコープされ,ボディの中のそのインスタンスは局所化されて,結果となるユーザインターフェース構文で追跡される値を保持する.シンボル y はスコープ解除され,y に対するカーネルの現在値を指す.y はいつでも設定することができユーザインターフェースの構文には関係しない.
DynamicModuleの語彙スコーピングは厳密に強制されることはなく,DynamicModuleが語彙ではない参照をスコープすることは可能である.つまり参照はDynamicModuleのボディに文字通りに現れないということである.
語彙スコーピングに反するDynamicModuleの使用例:
上の例ではDynamic[x1]の x はDynamicModuleによって厳密に語彙的にスコープされているがf1[]のx1はそうではない.それにもかかわらずf1[]によって生成されたスライダーは,大域的なカーネルインスタンスx1ではなくDynamicModuleの変数x1の値を明らかに変更している.
DynamicModuleの変数におけるスコーピングの問題を修正するためには,変数のすべてのインスタンスがDynamicModuleの変数のボディに文字通りに現れるようにコードを書き替える必要がある.前の例では,Dynamic[x]をf[]の引数として渡すことで問題を修正することができる.
完全なDynamic式ではなく直接変数にアクセスする必要がある場合は,関数がDynamicで囲まれた変数を取るように定義した方がよい.次の例では,f3は入力を入れ替えるスライダーを定義する.f3の関数パターンには,変数が隔離でき定義で使えるように,Dynamicが含まれる.
設定をTrueに変更して,ユーザインターフェース構文を生成するコードを再評価することで,コードが不適切なスコーピングを使っているかどうかを調べることができる.もとの例を再び実行すると,もう値に接続していないスライダーが示される.