•
|
Names Default To Here()関数。シンプルなスクリプトであれば、このコマンドだけで十分です。詳細については、第 “Names Default To Here”を参照してください。
|
•
|
JMPで定義済みの適用範囲。詳細については、第 “適用範囲が指定された名前”を参照してください。
|
•
|
独自のスクリプトに作成できる名前空間。詳細については、第 “名前空間”を参照してください。
|
Names Default To Here( 1 );
Names Default To Hereモードがオンになっているスクリプトの中の非修飾の名前は、そのスクリプトだけに関連付けられます。ただし、名前はスクリプトが存続する限り、または、そのスクリプトによって作成されたオブジェクトやそのスクリプトを保持しているオブジェクトがアクティブである限り、存続します。特別な理由がない限り、プロダクション環境で使用するすべてのスクリプトは、Names Default To Here(1)で開始することをお勧めします。スクリプトがこのモードで非修飾の名前を使用する場合、名前はローカルの名前空間内で解決されます。
グローバル変数を参照するには、名前の適用範囲を明確にグローバル変数として指定します(たとえば::global_name)。データテーブル内の列を参照するには、名前の適用範囲を明確にデータテーブル列として指定します(たとえば:column_name)。
メモ: Names Default To Here( 1 )は、特定のスクリプトのモードを定義します。グローバルな定義ではありません。あるスクリプトでこのモードを有効にし、別のスクリプトでは無効にすることができます。デフォルトではオフに設定されています。
JMP 8以前のバージョンでは、スクリプト同士を分離する唯一の方法が、他のスクリプトで使用されていないような長い名前を使用することでした。Names Default To Here(1)を使用すると、この方法が必要でなくなります。
簡単なスクリプトを作成するだけなら、Names Default To Here(1)で十分です。
Local()は、スクリプト内の特定のコンテキストにだけローカルな適用範囲を作成し、相互に作用する関数のある長いスクリプトを含めることはできません。一方、Names Default To Here(1)は、スクリプト全体に対してローカルな適用範囲を作成できます。Local()では、ローカルブロックにローカルな変数をリストします。明示的にリストされていないものは、そのブロックに対してローカルにはなりません。
Local Here()はNames Default to Here(1)をもつ名前空間ブロックを提供します。複数のスクリプトが同じルート名前空間から実行された場合(たとえば、スクリプトが同じ名前の変数を持つ2つのボタンスクリプトを実行する場合、または含まれているスクリプトがメインスクリプトから実行された場合など)、Local Here()を使用して名前の競合を防ぎます。
Names Default To Here( 1 );
x = 5;
y = 0;
Print( "Main, Before: x=" || Char( x ) || ", y=" || Char( y ) );
Include( "Inc1.jsl" );
Print( "Main, After: x=" || Char( x ) || ", y=" || Char( y ) );
Names Default To Here( 1 );
Local Here( // 変数はこのスクリプトのローカル
x = 100;
y = 100;
Print( "Inc1: x=" || Char( x ) || ", y=" || Char( y ) );
);
Print( "Inc1 outside: x=" || Char( x ) || ", y=" || Char( y ) );
"Main, Before: x=5, y=0" // Inc1.jslを実行する前に、Main.jslで定義
"Inc1 outside: x=5, y=0" // Inc1.jslから、Main.jslを参照
"Main, After: x=5, y=0" // Inc1.jslの実行後、Main.jslから
inc1.jslの変数xと変数yは「Local Here」名前空間にあるために、変化しないことに注意してください。
Names Default To Here()関数は、非修飾の名前付き変数参照の解決方法を決定します。here:var_nameを使って明示的に変数のスコープを指定すれば、Names Default To Here()のオン/オフに関わらず常に適用範囲で動作します。hereおよびその他の適用範囲については、第 “適用範囲が指定された名前”を参照してください。
Names Default To Hereモードを有効にすると、Hereというスコープが実行スクリプトに関連付けられます。Hereスコープには、作成された非修飾の名前付き変数のうち、割り当ての対象(L-value)であるものすべてが含まれます。JMP 8以前のバージョンでは、これらの変数は通常、グローバルスコープに置かれていました。Hereスコープを使うと、複数の実行スクリプト内の変数がお互いに分離され、名前の競合が回避されるので、変数名の管理やスクリプト作成が簡単になります。Globalスコープを使えば名前を共有できます。
このスクリプト例を一度に1行ずつ実行し、Names Default To Here()関数が変数名の解決にどのような変化をもたらすかを見てみましょう。
a = 1;
Names Default To Here( 1 );
a = 5;
Show( global:a, a, here:a );
1.
|
1行目を実行し、名前がa、値が1のグローバル変数を作成します。
|
2.
|
2行目を実行し、Names Default To Hereモードをオンにします。
|
3.
|
Show(::a, a, here:a);
a = 1; // スクリプト1
Show( a );
a = 3; // スクリプト2
Show( a );
3.
|
スクリプト1のshow(a);行のみを実行します。結果は次のとおりです。
|
変数aはグローバルで、スクリプト2によって最後に変更されたため、ログにはa = 3と表示されます。これは、JMP 9以降ではデフォルトの動作ですが、JMP 8以前のバージョンでは唯一可能な動作でした。
4.
|
Names Default To Here(1);
7.
|
スクリプト1のShow( a ); 行のみを実行します。結果は次のとおりです。
|