scope:nameという形式のスコープを使用することにより、名前を解決する場所を指定できます。ここで、scopeは名前の解決方法を示します。たとえば、here:nameは、名前がローカルで解決されるべきであることを意味します。Names Default To Hereモードを使用すると、here:nameはnameと等価です。スコープは名前の参照方法を指示します。
構文では、コロンを添えたスコープ演算子を使用します。
scope:name
スコープには、次のいくつかの種類があります。
• 解決ルールを示すもの。たとえば、here:xは、xがスクリプトにローカルな名前として解決されるべきであることを意味します。Global:xは、xがグローバル名として解決されるべきであることを意味します。
• 名前空間の参照変数。たとえば、ref:aは、aが、refが参照する名前空間で解決されるべきであることを意味します。
• 名前を列名として参照するデータテーブル参照。たとえば、dt:heightは、heightが、dtが参照するデータテーブルの列として解決されるべきであることを意味します。
• 独自に作成した名前空間の名前。たとえば、myNamespace:b。ここで、myNamespaceは作成した名前空間。"myNamespace":bも等価です。JSLの名前空間を参照してください。
メモ: 関数を作成するときは、ビルトイン関数との競合を防ぐため、適用範囲を明示的に指定してください。
以下の例は、計算式を含んだ列の適用範囲の指定方法を示しています。スクリプトの中で、xはグローバル変数、ローカル変数、列名として使用されています。
最初のスクリプトでは、列名xは適用範囲が指定されていません。2番目の列内の計算式は、列xの値を100倍するものです。この場合、列の値は100、200、300という結果になります。
::x = 5;
New Table( "テスト",
New Column( "x", Values( [1, 2, 3] ) ),
New Column( "y", Formula( 100 * x ) ),
);
次のスクリプトでは、列yの計算式はローカル変数xに500を割り当てた後、xに50を足します。列の各セルの値は550になります。
::x = 5;
New Table( "テスト",
New Column( "x", Values( [1, 2, 3] ) ),
New Column( "y", Formula( Local( {x = 500}, x + 50 ) ) ),
);
JMPには、削除や置換ができない定義済みスコープが用意されています。各スコープには、関連するオブジェクトに応じて、特定のルールがあります。
スコープ |
説明 |
---|---|
Global |
グローバル名はJMP環境全体で共有される。 |
Here |
実行スクリプトを範囲としたスコープ。 |
Builtin |
JMPビルトイン関数。たとえば、Builtin:Sqrt()。名前は、JMP環境全体で共有されます。 JSL関数をカスタム関数で上書きした場合でも、このスコープを使ってビルトインのJSL関数にアクセスできます。 |
Local |
ローカルスコープに似たスコープ。Function()、Local()、Parameter()の関数内で使用できます。 |
Local Here |
Names Default to Here(1)内に名前空間ブロックを提供する。複数のスクリプトが同じルート名前空間から実行された場合(たとえば、スクリプトが同じ名前の変数を持つ2つのボタンスクリプトを実行する場合など)、名前の競合を防ぐには、Local Here()を使用します。引数には任意の有効なJSL式を使用できます。 ローカルブロックには寿命があるのでLocal( {Default Local}, )は常に機能するとは限りませんが、Local Here()は呼び出し全体にわたって維持されます。 |
Window |
含まれているユーザ定義ウィンドウのスコープ。(まれ) |
Platform |
現在のプラットフォームを範囲としたスコープ。(まれ) |
Box |
ContextBox()を範囲としたスコープ。ContextBoxはユーザ定義ウィンドウ内で使用されます。(まれ) |
この例は、Windowスコープを使って、実行中に情報を渡します。変数xおよびyの適用範囲をウィンドウに指定することで、xとyはデータテーブルなどの他のコンテキストに適用されなくなります。変数xおよびyは、指定のWindow環境内だけで作成および使用されます。Windowスコープは、Local()を使用するのと似ていますが、それより便利です。なぜなら、Local()は使用できる範囲が限られているからです。
New Window( "例",
window:gx = 20;
window:gy = 50;
Graph Box(
Frame Size( 200, 200 ),
Handle(
window:gx,
window:gy,
Function( {x, y},
window:gx = x;
window:gy = y;
)
);
Circle( {0, 0}, Sqrt( window:gx * window:gx + window:gy * window:gy ) );
);
);
図8.1 現在のウィンドウ名前空間の例
この例は、Hereスコープを使い、同じスクリプトによって作成されたウィンドウ間で情報を渡します。Here:を使って変数の適用範囲を指定する際、Names Default To Here()がオンである必要はありません。Here:スコープは常に使用できます。
次のスクリプトは、2つのウィンドウを作成し、2つの異なるスコープを使用します。
「起動」ウィンドウがユーザに2つの値を入力するよう求めます。その2つの値が「結果」ウィンドウに渡され、それらの値を使って関数がグラフ化されます。「起動」ウィンドウは、aBoxとbBoxの適用範囲をそのウィンドウに限定します。基本的に、それらの変数(Number Edit Boxesへの参照)は「起動」ウィンドウ内にのみ存在し、「結果」ウィンドウでは使用できません。その後、2つのボックスの値がHereに範囲指定された変数内にコピーされ、このスクリプトによって作成された両方のウィンドウで使用可能となります。
launchWin = New Window( "起動",
<<Modal,
V List Box(
Lineup Box( N Col( 2 ), Spacing( 10 ),
Text Box( "a" ),
window:aBox = Number Edit Box( 50 ),
Text Box( "b" ),
window:bBox = Number Edit Box( 20 ),
),
Lineup Box( N Col( 2 ), Spacing( 20 ),
Button Box( "OK",
// ウィンドウを閉じる前に値をコピーする
here:a = window:aBox << Get;
here:b = window:bBox << Get;
),
Button Box( "キャンセル", Throw( 1 ) )
),
)
);
New Window( "結果",
Graph Box( Y Function( here:a + here:b * Sin( x / 30 ), x ) )
);
図8.2 起動と結果