DynamicModuleのスコープ

DynamicModuleは語彙スコーピングの構文となることを意図している.つまりDynamicModuleの変数は,DynamicModuleのボディに文字通り現れる変数のインスタンスだけをスコープするのである.これはModuleの動作に似ている.例えば以下の入力を見てみよう.
シンボル xDynamicModuleによってスコープされ,ボディの中のそのインスタンスは局所化されて,結果となるユーザインターフェース構文で追跡される値を保持する.シンボル y はスコープ解除され,y に対するカーネルの現在値を指す.y はいつでも設定することができユーザインターフェースの構文には関係しない.
スコープ解除されたDynamicModuleの変数
DynamicModuleの語彙スコーピングは厳密に強制されることはなく,DynamicModuleが語彙ではない参照をスコープすることは可能である.つまり参照はDynamicModuleのボディに文字通りに現れないということである.
語彙スコーピングに反するDynamicModuleの使用例:
上の例ではDynamic[x1]xDynamicModuleによって厳密に語彙的にスコープされているがf1[]x1はそうではない.それにもかかわらずf1[]によって生成されたスライダーは,大域的なカーネルインスタンスx1ではなくDynamicModuleの変数x1の値を明らかに変更している.
このような使用法はWolfram言語では動作するがアンチパターンとみなされ避けるべきである.
スコープ解除されたDynamicModuleの変数を修正する
DynamicModuleの変数におけるスコーピングの問題を修正するためには,変数のすべてのインスタンスがDynamicModuleの変数のボディに文字通りに現れるようにコードを書き替える必要がある.前の例では,Dynamic[x]f[]の引数として渡すことで問題を修正することができる.
語彙スコーピングの問題を修正するバージョン:
この場合,x2の値は式Slider[Dynamic[x2]]で完全に表されるまで評価されないままでなければならないので,単純にx2ではなくDynamic[x2]を渡すことが重要である.
完全なDynamic式ではなく直接変数にアクセスする必要がある場合は,関数がDynamicで囲まれた変数を取るように定義した方がよい.次の例では,f3は入力を入れ替えるスライダーを定義する.f3の関数パターンには,変数が隔離でき定義で使えるように,Dynamicが含まれる.
f3Dynamic式を取るように定義する,より複雑な例:
スコープ解除されたDynamicModuleの変数を検出する
厳密な語彙スコーピングを強制するためにはシステムオプション"DynamicModuleScopingEnabled"を使うことができる.
厳密な語彙スコーピングについての現行の設定を返す:
設定をTrueに変更して,ユーザインターフェース構文を生成するコードを再評価することで,コードが不適切なスコーピングを使っているかどうかを調べることができる.もとの例を再び実行すると,もう値に接続していないスライダーが示される.
厳密な語彙スコーピングを強制した,欠点のあるもとの例:
実際,f4で実装されたスライダーは大域的なカーネル変数x4を参照するようになっている.これはDynamicModule構文の内側と外側の両方でDynamic[x4]の値を確認することで検証できる.
f4は大域的変数x4を参照している:
システムオプションはシステムにおけるコードすべてに影響を及ぼすので,スコーピング問題が修正されていないコードを実行するためにはオプションをもとの設定に戻す必要がある.
システムオプションをデフォルト値にリセットする: