類似処理の自動反復化3
前章で予告した通り、この章では残りのループマクロ命令を完了させたいと思います。
for命令もマクロからなるものですが、パラメータが他のものより少し多いです。
for カウンタ変数, 始値, 終値, 増分値
カウンタ変数ループのカウンタとして使用する変数を指定する。
始値カウンタ変数のループ初期値を指定する。
終値カウンタ変数の到達点。始値から始まり終値をまたぐとループを抜ける。
増分値1ループ毎に増やす(減らす)カウンタ量。
ループ開始時にカウンタ用に使用する変数を始値で初期化し、ループの度に増分値ずつ増やし(減らし)ます。
カウンタ変数が終値以上(減らす場合は以下)になるとループ末端の次行から処理を再開させますが、
ループ末端というのは下記命令を使用して表します。
next
[パラメータなし]処理をforまで戻すだけの為、パラメータは必要ない。
カウンタの初期化や、終了制御、ループ毎のカウンタ増減を別途書かずにいける点が実にスマートです。
 1
 2
 3
 4
	for i, 3, 0, -1 // 3から始めて-1ずつカウンタ値を減らし、0になったら終了する
		mes "" + i + "..."
	next
	mes "Go!"
前章で説明したマクロループを抜ける_break_continue命令は、fornextループでも使用できます。
dountilループやwhilewendループとは違い、fornextループの終了条件は回数でありますが、
_continue命令は共通マクロである為に、_continue命令のパラメータとして、再開回数の指定はできません。
常にスタートポイントであるfor命令位置に戻り、カウントを1だけ進めます。
for命令は幾つかの命令を組み合わせ1つの命令に仕上げ、
その命令を呼び出すことで「定義した幾つかの命令を実行するマクロ命令」の1つであるわけですが、
内部で「あまり他では使われない少し珍しい命令」を使用しており、
ややこしいもののfor命令の説明以外で別途説明することが難しい為にココで紹介します。
exgoto 比較変数, 比較フラグ, 比較値, ラベル
比較変数比較の対象とする数値を入れた変数
比較フラグ0以上の指定で「比較変数 >= 比較値」、0未満の指定で「比較変数 <= 比較値」の時に発動
比較値比較フラグで比較変数との比較に使用する値
ラベル比較フラグで発動条件に一致した場合に処理を飛ばす飛ばし先ラベル
まず、一番の基準となるものが比較フラグです。
比較フラグにプラス(0以上)を指定すると、比較変数が比較値以上の場合にラベルで指定したラベルへ、
比較フラグにマイナスを指定すると、比較変数が比較値以下の場合に指定ラベルへ処理を移します。
上記説明を見ていただいても分かる通り、特殊っぽい仕組みで何やら難しそうですね。
それにラベルと言うものが出て来ました。
ラベルは、以前に紹介したことがあるので全くの初めてではありませんが、
使い方等については一切触れておりませんでした。
また、ラベルと言えば初めに紹介すべき命令も本当は別にあるのですが、
for命令説明の関係で、このexgoto命令の方で先にラベルの紹介することとなりました。
本来紹介すべき命令は次章で説明します。
それでは、exgoto命令に先立ちましてラベルについて説明します。
ラベルとは、スクリプト内の目印となるポイントのことで旗(フラグ)と呼ばれたりもしています。
プログラムの実行順序は、上から下へ流れていきますが、
一方通行では困ると言うことを繰り返し命令の初めに解説致しました。
たまには上に書いたスクリプトを実行したい・実行する必要がある場合があります。
また、順番でなく下の方に書いたスクリプトまで処理を飛ばしたいときもあることでしょう。
そういった場合、どこまで処理を移すのかを指定する必要があり、
その必要なものが、「ココまで処理をジャンプしてね」という目印、ラベルなわけです。
書き方は『*(アスタリスク)』+『ラベル名』形式で、例えば「*Label」「*hspbc」等と言う形です。
「*」に続き、半角英字から始まる半角の英数文字を最大59文字まで付けられます。
HSP3では、ラベル数の最大は無制限となってますが、同一ラベルは重複することが出来ません。
どちらのラベル先にジャンプするのか判断できなくなりますからね。
アルファベットの大文字小文字を区別しませんので覚えておきましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
*start
	mes "処理開始!"
	mes "ココは開始直後の処理位置です。"
*First
	mes "第一ラベル通過!"
	mes "ラベルを書いても処理自体に影響ありません。"
*Second
	mes "第二ラベル通過!"
	mes "処理を飛ばす意味だけでなく、"
	mes "単純にスクリプトの目印としてだけの意味でも"
	mes "活用してください。"
*Third
	mes "第三ラベル通過!"
	mes "ココで処理は終わりです。"
当サイトでは横に長くなるのを防ぐ意味でもTABではなく、半角スペースで表していますが、
HSPはスクリプトの見やすさの為に先頭にTABを入れておくことを推奨しています。
ただ、通常スクリプトではなくラベルや一部の特殊命令は挿入場所を判り易くする為に余白は入れません。
また、当サイトではラベルは開始点を意味する為、4行目8行目14行目のように、
前行に空行を入れ、処理が異なることを明示してます。
ラベルについて以上で説明を終わりまして、exgoto命令を使ってみましょう。
 1
 2
 3
 4
 5
 6
 7
 8
	hikaku = 5
	mes "比較値であるhikakuは" + hikaku + "。"
*_Start
	mes "現在value=" + value + "である為、valueはhikaku程ではありません…"
	value++
	exgoto value, -1, hikaku, *_Start // value <= hikaku の間_Startラベルへ
	mes "valueはhikakuよりも大きくなりました。"
ラベルの開始文字は英字、また、途中に使える文字でも英数のみと書き、
変数時も「_」を利用できましたが、プログラムでは「_」も英字の一部として利用することが出来ます。
これはHSP以外の言語であっても有名所では大半が同様にして「_」は記号ではなく英字として利用できます。
また、もう1つだけラベルに使える本来記号文字がありますが、ソレは次章で。
ヘルプに書かれている通り、この命令は一部のマクロ処理の高速化の為に用意された命令であり、
使い方や命令の動作が少し特殊で、単体で使うとスクリプトが見にくくなるだけである為、
単体での使用は推奨されていませんし、一部のマクロの為というより、
むしろforマクロの為に用意した命令と言っても過言ではないと私は思います。
無駄な処理を書くことはもちろん、分かりにい命令はそれ以上に控えた方が良い為、
推奨していない命令は使わない方が無難です。
この命令でなければ処理が実現できないと言うものではありませんし…。