目次
条件分岐・繰り返し
命令の説明
BREAK
REPEATループやFOR,DO,WHILEの各ループの中にこの命令がある場合、ループを中断して、ループの終端命令(REND,NEXT,LOOP,WEND)の次の行に移動します。
CONTINUE
REPEATループやFORループの中にこの命令がある場合、ループ命令のところに戻ります。つまり、それ以降〜ループ終端命令までの部分を実行せずにカウンターを一つ進めるという処理になります。
IF系
IF 条件
- 分岐命令です。条件が真(成立する)ならば以下の命令を実行します。
ELSEIF 条件
- 分岐命令です。必要ならばIF文とENDIF文の間に置かれます。条件が真(成立する)ならば以下の命令を実行します。
ELSE
- 分岐命令です。必要ならばIF文とENDIF文の間に置かれます。ELSE文以下の命令を実行します。なお、ELSEの後には別のELSEやELSEIFを置くことはできません。
ENDIF
- 分岐命令の終端を示します。IF文の後に必ず置かれます。
GOTO ラベル
ラベル名の次の箇所まで移動する命令です。ラベルがなければエラーを出します。関数を飛び越えての移動はできません。
REND
REPEATループの終端を表します。必ず必要です。
REPEAT 数値変数or数値
ループ命令です。REPEATの後ろの数字の回数だけRENDとの間を回ります。なお、何度目のループか?というのは数値変数COUNT:0を見れば分ります。
SIF 条件
分岐文です。条件が真(成立する)ならば直後の一行分の命令を実行します。IF文と違って、ENDIF文は不要ですし、ELSEやELSEIF文による分岐はできません。
FOR <数値型変数>, <数式>, <数式>{, <数式>}\\ NEXT
FOR〜NEXTはREPEAT〜RENDの機能強化版です。
第1引数はカウントに使用される変数を表します(REPEATでは常にCOUNT:0)。
第2引数は変数に最初に代入される値を表します(REPEATでは常に0)。
第3引数はループが終了される値を表します(REPEATで設定可能な値)。
第4引数はループごとに加算される値を表します(REPEATでは常に1)。
FOR COUNT, 0, X 〜〜 NEXT REPEAT X 〜〜 REND
上の二つはほぼ同じ動作をします。
ともにX回の繰り返しを行う構文で、ループの途中でCONTINUEやBREAKを使用できます。
異なる点はカウント用の変数を指定できることと、開始値とステップを変更できることです。
また、FOR〜NEXTは入れ子にすることができます。
FOR Y, 0, 100 FOR X, 0, 100 〜〜 NEXT NEXT
第1引数である<変数名>に指定できる変数は数値型の変数のみです。キャラクタ変数も使えません。
第4引数である<ステップ>は省略可能です。省略した場合、1です。
<ステップ>が正の値のとき、繰り返しのたびに<変数名>の変数に<ステップ>が加算され、第3引数<終了値>以上となったときにループが終了します。
<ステップ>が負の値のときは、<変数名>の変数が<終了値>以下となったときにループが終了します。
<ステップ>が0であれば無限ループになります。BREAK文が実行されるまで永久に繰り返します。
各値はループの開始と同時に固定され、ループの途中で変数が変化しても影響を受けません。
以下の2つは同じ結果になります。
;1 X = 10 FOR COUNT:X, 0, X, X/10 X = 10000 NEXT
;2 FOR COUNT:10, 0, 10, 10/10 X = 10000 NEXT
なお、GOTO等の命令で直接FOR〜NEXT内に入った場合、REPEAT〜RENDと同様にNEXTの直前まで通常通り実行し、その後NEXTを無視して次の行から処理を続行します。
WHILE <数式>\\ WEND
REPEAT〜RENDやFOR〜NEXTのような繰り返し構文の一種です。
WHILEの<数式>が0以外である限りループを繰り返します。
常に満たし続ける条件を与えると、BREAKで抜けるようになっていない限り無限ループになります
あまりにループ処理が長いとEmueraが文句を言う場合があります
なお、GOTO等の命令で直接WHILE〜WEND内に入った場合、通常どおりWENDに到達した時点でWHILEへループし、条件を判定します。
DO\\ LOOP <数式>
REPEAT〜RENDやFOR〜NEXTのような繰り返し構文の一種です。
Cのdo〜while、VBのdo〜loop while構文と同様、LOOPの<数式>が0以外である限り実行をループを繰り返します。
WHILE〜WENDと異なり最低でも1回は実行されることが特徴です。
なお、DO〜LOOP内のCONTINUEした場合にはLOOPの条件を満たしていなければそのままLOOPを抜けます。CONTINUEしてもDO文に戻るとは限らないことに注意してください。
また、GOTO等の命令で直接DO〜LOOP内に入った場合、通常どおりLOOPに到達した時点で条件を判定し、<数式>が0以外ならDOへループします。
SELECTCASE <式>\\ CASE <CASE条件式>(, <CASE条件式>, <CASE条件式> ……)\\ CASEELSE\\ ENDSELECT
分岐構文です。Visual Basicの同名の構文と動作を似せています。
IF構文と似ていますが、SELECTCASEは1つの値を元に複数の行へ分岐する構文です。
SELECTCASEに指定した引数の値によって分岐します。 もっとも単純な使用法は以下のようになります。
SELECTCASE X CASE 1 PRINTL Xは1です。 CASE 3 PRINTL Xは3です。 CASEELSE PRINTL Xは1でも3でもありません。 ENDSELECT
このスクリプトはXの値によって分岐します。
SELECTCASE文が実行された時、Xが1であれば“CASE 1”の行に飛び、次のCASEまたはCASEELSEまでの行を実行します。
同様にXが3であれば“CASE 3”に飛びます。
Xの値に対応するCASE文がない時、CASEELSE文があればそこに飛びます。なければENDSELECTに飛びます。
Cなどのswitch文と異なり、1つのCASEから次のCASEに流れ落ちることはありません。
また、BREAK文でENDSELECTに飛ぶことはできません。
なお、GOTO等の命令で直接SELECTCASE〜CASE〜CASEELSE〜ENDSELECT内に入った場合、IF〜ELSEIF〜ELSE〜ENDIFと同様に
CASE、CASEELSE、ENDSELECTの直前まで通常通り実行したあとに、ENDSELECTの次の行へ飛び処理を続行します。
CASEの条件式には3種類の書式があります。
1つは上記のように値を直接指定する方法、2つ目は“IS <演算子> <数式>“、3つめは”<数式> TO <数式>“です。
“IS <演算子> <数式>“の場合、例えば”IS ⇐ 30”であればXが30以下の場合、CASE以下が実行されます。
”<数式> TO <数式>“の場合、例えば”10 TO 20”であればXが10以上20以下の場合、CASE以下が実行されます。
また、CASEには複数の条件式をカンマで区切って指定することができます。
これらを利用して例えば以下のように書くことができます。
SELECTCASE X CASE 1 PRINTL Xは1です。 CASE 2,3 PRINTL Xは1ではありません。 PRINTL Xは2か3です。 CASE 10 TO 20 PRINTL Xは1でも2でも3でもありません。 PRINTL Xは10以上20以下です。 CASE IS <= 30 PRINTL Xは1, 2, 3, 10以上20以下のどれでもありません。 PRINTL Xは30以下です。 CASE 40, 5 * 10 TO 6 * 10, IS >= 10 * 10 PRINTL Xは30以下ではありません。 PRINTL Xは40, 50以上60以下, 100以上のいずれかです。 CASEELSE PRINTL Xは30以下, 40, 50以上60以下, 100以上のいずれにも該当しません。 ENDSELECT
ISやTOは“IS <演算子> <数式>“、”<数式> TO <数式>“の形で使わねばならないことに注意してください。
例えば”30 < IS”や“(10 TO 20) || (30 TO 40)“のような書き方はできません。
また、”<数式> TO <数式>“はあくまでも左辺以上、右辺以下の場合に真となります。
右辺が左辺より小さい場合はそのCASEが実行されることはありません。
1つのCASEに複数の条件式がある場合、短絡評価が起きることに注意してください。
条件は左から順にチェックされ、条件を満たすものが見つかった場合、残りの条件は評価されません。
SELECTCASEの引数として文字列式を使用することもできます。
SELECTCASEに文字列を指定した場合はCASEの条件式も文字列式である必要があります。
乱数制御
