AREA 021
Featuring AlphaScript

STEP 12 スコープ

 

AlphaScript では同じ名前の変数・ラベルをスクリプト内にいくつも宣言できるようになっています。  でもそれだと、呼び出す名前を書いたとき、どれが対象になるのかわかりませんよね。  そのため、変数やラベルには「有効範囲」を設けています。

具体的には、次のような決まりがあります。 (ここでは、変数とラベルをひとまとめにし「要素」と呼ぶことにします)

・ある名前の要素はスコープ内に1つだけしか用意できない。
・ある場所で使われる要素は同じスコープ内にあるもの。
・ただし、同じスコープ内になければ、外側のスコープ内にあるものを探す。
・そこにもなければ、さらに外側のスコープを探し、最も外側ま探して見つからなければエラー。
・言い換えると、そこより内側のスコープ内を見ることはできない。

スコープというのは、要素の有効範囲の単位のことで、 { } で囲むことによって表現できます。

// スコープ1はじめ

{

  // スコープ2はじめ

  // スコープ2おわり

}


// ここもスコープ1


{

  // スコープ3はじめ

  // スコープ3おわり

}

// スコープ1おわり

{ } を書くときは、見やすくするため上記のようにインデント(字下げ)することをオススメします。  このスコープを意識して変数を使ってみた例を示します。

$ a;

a = 1;

{

  $ a;

  a = 2;

}

{

  $ a;

  a = 3;

}

{

  $ b;

  a = 4;

}

// これはエラー
// $ a;

a = 5;

この例だと、 a = 1 と a = 5 で参照しているのは変数 a は一番上で定義されたもので、 a = 2 で参照している変数 a は1つ目の { } の中で定義されたもの、 a = 3 で参照している変数 a は2つ目の { } の中で定義されたもの、 ということになります。  a = 4 で参照する変数は、同じスコープ内に a が見つからないので、一番上で定義されている外側の a になります。  最後のほうの変数 a の宣言は、コメントアウトしないとエラーになります。  同じ名前の変数が同じスコープ内にすでに存在するからですね。

この仕組みは、独立された処理でのみ使う要素を定義するのに役立ちます。  そのスコープ内に宣言を書けば、同じ名前で別の場所にある要素を間違って使ってしまう、なんてことが起こらなくなるからです。

@ aaa;

{

  $ a,b,c;

  @ lab;

  // 変数 a,b,c とラベル lab はこの部分でしか使わない

  return: 0;

}

もうお気付きかもしれませんが、条件分岐も { } を書くので、自動的にスコープが発生します。  通常の { } は条件の無い if 文である、と言い換えることもできます。

if: x == 100 {

  // ここもスコープ

}

 

ページ一覧に戻る  次のステップへ!

Copyright (c) Rabit 2005-2012 all rights reserved.