do [repetitor] [conditional]; instructionlist end [name]; repetitor の部分は, (↓)のなかのどれかひとつ:
do は end と対になって使われたりする。 けど, end があればその前の部分に do があるはずかとゆーと, ちょっと違う。 とゆーのも, ほかにこんなのもあったりするから。
do 〜 end の使い方も, 実は二種類ある。 まずは文節(?)をまとめるとゆー使い方。コレは if 文と組み合わせたりするもので, こんな感じのものに相当する。
{〜
}
begin〜
end
そしてもう一つの使い方はループ。
ループのときの数え方は言語によって微妙に違っていたりして, 思想の違いっつーかそんなのを感じたりしないでもない。
それは 0から数を数え, 例えば 1メートルおきに杭を立てるとき何本になるか? みたいな数え方と, それから, 単純に 1から数え, 杭と杭との間の空間の数を数えるよーな数え方。
Rexxでは主に 1から数えることが多い。
do i = 1 to score_count say i '番目は' score.i end
でも C言語風に 0から数えるよーな記述もできたりする。
do i = 0 for score_count
say i '番目は' score.i
end
/* あるいは 「conditional」を指定する場合 */
do i = 0 while i < score_count
say i '番目は' score.i
end
後者の方が C言語のソレに近いかも。
その(大きな)違いは, ループ中に score_countの値を変更すると, ループの回数も変わるかどーかってとこ。
drop namelist; namelist は変数名のリスト
exit [expression];
プログラムを終了する。んで 呼び出し元にもどる訳だけど, 呼び出し元が Rexxプログラムだったりすることもあるかも。
つまりコマンドラインから起動されたら, コマンドプロンプトのとこにもどるんだけど, あるプログラムからサブルーチンのよーに呼び出されたら, (コマンドラインではなく)元のプログラムにもどる。
関数を callする場合 returnで もどる訳だけど, 関数ではない主処理で returnすると, 呼び出し元のプログラムにもどる。てことで, exitとゆーのは, 主処理での returnと同じ。
それから, returnと同じよーに呼び出し側に戻り値を返したりできる。
呼び出し側が Rexxの関数呼び出しならば, 返せる値は文字ストリング, そして, コマンドラインならば, ソレは数値しか返せない。(0〜255だっけ?)
nop;
ダミー。 no operations。then とか else の後ろに置いたりして, 何もしなくてよいことを指定したりする。 何もしなくてよいからって 何も置かなかったら, thenの次の行がその対象になったりするので, 使い道がない訳じゃないのかも。
if expression[;] then[;] instruction [else[;] instruction]
条件判断するときに使う。条件が真のとき then
以降を実行し, 偽のときは else
以降を実行する。
他の言語では then
てゆー単語を記さなくてよいものもあるんだけど, ソレはソレで一長一短ある訳。
てゆーのは, 条件式と, 真のときに実行する命令群, そのふたつの区切りに then
がある訳なので, 条件式はかっこで括らなくてよいのだ。
if文には, 暗黙のセミコロンの場所がいくつかあって, このことで, それなりに自由な表現ができたりする。
つまり, then
を次の行に置いてもよいし, if文と同じ行でもよい。
でも, else
を if文と同じ行にするには ;
を指定しなきゃなんない。てゆーのも instruction にソレが必要だから。
iterate [name];
他の言語では continueに相当するつったら分かるかも知れない。
ループの中に指定することができ, ループの先頭に戻るってヤツ。
name は, do
で使っている名前(カウンター?)で, 多重にループを抜け出すときに指定すると便利かも。