AREA 021
Featuring AlphaScript

STEP 7 ラベルとジャンプ

 

ラベルを定義すると、スクリプトの実行位置を自由に動かせます。  それをするコマンドを AlphaScript では「ジャンプ」と呼びます。 

まずは、 @ ラベル名 と書いて「ラベル」を作ります。  ラベル名は自由に決められます。  ただし、変数名と同様、システムで予約されている文字は禁止です。  ラベルと同じ名前の変数が存在してもエラーにはなりませんが、紛らわしいので避けたほうが良いです。  また、変数のように , で区切って複数同時に宣言できますが、基本的にその必要はありません。(仕様上は一応、ということで(^^;)

@ aaa;

ラベルは、別の場所から移動する際の目印となるものなので、宣言しただけでは何も起こりません。  そして、このラベルに移動するコマンドは以下のように書きます。

* aaa;

この位置に到達すると、その時点で実行位置が * の後に指定したラベルまで飛びます。  当然ながら、存在しないラベルを指定してしまうと、エラーになります。

* aaa;

x += 1;

@ aaa;

たとえば、このように書いたとすると、一番上の * aaa に到達した時点で @ aaa の場所まで飛ぶため、 間に入っている x += 1 は決して実行されないことになります。  例のように書くのは計算式が無駄になるだけで全く意味ないですが、 このジャンプ機能をうまく使えばさまざまな「流れ」を作り出せます。

ジャンプには、* による通常のジャンプの他に、& を書いて移動する方法もあります。 (これをコールと呼ぶことにします)  コールもジャンプと同様、指定したラベルの場所に実行位置を移動しますが、ひとつだけ違う点があります。  それは、 return コマンドが使えることです。(ジャンプでは使えません)  コールは実行されたとき、移動する前にどの位置にいたかを覚えてくれます。  そして、その後 return コマンドを見つけると、直前にコールで移動した元の場所に戻ることができます。

// ここで前の処理

// xyz をコール
& xyz;

// ここでその後の処理


@ xyz;

def += 1;

return: 0;

こう書けば、最初のコールで xyz ラベルに飛び、その後の return コマンドによって & xyz の位置まで戻ります。  @ xyz から return までの部分が独立していることに気付かれましたか?  これによって、 def += 1 という処理を好きなタイミングで呼び出せます。  この例では、 & xyz を複数書けば、その回数だけ def += 1 を実行してくれる、ということです。

ところで、return の後に付いている 0 は何なのでしょうか? それは私にもわかりません。  そもそも、世の中の全ての存在はナンセンスなのです。 ・・・冗談です。(笑)  これは、コールが終了した時、呼び出した処理の結果を伝えるためのものです。  とりあえず必ず 0 と書けばいい、と思っておいてください。

なお、コールをしていない状態で return すると、その時点で処理を終了します。 (これについては処理ブロックで解説しています)


無限ループについて

ここで、ジャンプを使うことによって発生する「危険な罠」について解説しておきましょう。  次の例をご覧ください。

@ abc;

* abc;

これを実行すると、ラベル abc を通過した直後にジャンプで abc に戻りですが、 戻ったらまたすぐに同じジャンプがあるのでまた戻って・・・・という流れが無限に繰り返されます。  これが、プログラミングにおける典型的な”危険”である「無限ループ」と呼ばれるものです。

普通のプログラミングでこのような処理をさせると、大抵はフリーズ状態(またはそれに近い状態)に陥ります。  コンピュータが永遠に終わらない仕事をしているわけですから、当然ですね。

ただ、 AlphaScript では同じジャンプコマンドが一定回数を超えて呼び出されると、 無限ループとみなしスクリプトの実行を自動的に中断してくれます。  実際にどうなるのか興味のある方は、上記のスクリプトを一度実行してみてください。 (他の言語では絶対にマネしちゃいけませんよ!)


識別番号

ラベルには識別番号があります。(ラベル番号でもいいかな?)  普通に @ を書いて作ったラベルは、識別番号 0 を持っています。  この識別番号は、ラベル名の後に [ ] を付けることで指定できます。

@ labelName[ 3 ];

ラベルの番号は、計算式を含まない整数で指定します。  同じ名前のラベルでも、識別番号が違えば複数宣言できます。  この番号を使用したラベルの呼び出し方は、以下のようになります。

* LabelPointer[ 3 ];

このように、ジャンプしたいラベル名の後ろに [ ] を付ければ、そのラベル番号が示すラベルに飛ぶことができます。  ジャンプでもコールでもこの記述が使えますし、番号を変数で指定することもできます。

この機能は、必ずしも必要というわけではないですが、 場合によっては、合理的で効率の良いスクリプトを実現できます。  ある変数の内容によって、まったく違う処理をしたい場合を想像してみるとわかりやすいかと思います。  うまく使えば、スクリプトのサイズも節約できて一石二鳥ですよ〜。


それにしても、変数とか演算子とか言ってたら、今度はラベルやらジャンプやらが出てきて、 日本語と英語のキーワードが混ざってしまってますね。  コンピュータ用語では、英語と日本語がどちらも使われるものがありますが、 やはり「しっくりくる」ほうが好まれるようです。

スクリプトを台本とは表現しませんし、変数を英語で”バリアブル”と呼ぶのもどうかな、と。  そんなわけで、プログラミングは2つの言語が共存している世界になってます。

 

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

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