トップページへ | [ 一覧 | 検索 | 最終更新 ] [ 差分 | 履歴 | 凍結 ] |
フロー制御†ifによる分岐†式の結果が真であれば以降に続く{ }内を処理します。 if文の条件式は()で括っても構いません。 request { if !i { "iは0である。" } } すぐ後にelseif節を付加することができます。これはifの判定が偽であった場合のみ処理されます。 request { if !i { "iは0である。" } elseif i == 5 { "iは5である。" } elseif "A" _in_ TOUPPER(i) { "iは文字列で、aもしくはAを含んでいる。" } else { "iは0でも5でもaを含む文字列でもない何物かである。" } } if、elseif、elseが処理する{ }内にスクリプトが1つしか存在しない場合は、{ }を略せます。したがって上の例は 下のように書きなおすことが出来ます。 request { if !i "iは0である。" elseif i == 5 "iは5である。" elseif "A" _in_ TOUPPER(i) "iは文字列で、aもしくはAを含んでいる。" else "iは0でも5でもaを含む文字列でもない何物かである。" } ただしifが重なっている場合は{ }の省略は出来ません。以下はC言語では正しいですが、文では誤りです。 if i == 0 if j == 0 "iとjはともに0である。" 以下のように{ }が必要です。 if i == 0 { if j == 0 "iとjはともに0である。" } caseによる分岐†caseはラベル分岐構造を実現します。 request { case i { when 0 { "iは0である。" } when "A" "iは文字列Aである。" others { "iは0でもAでもない。" } } } caseに与えられた判定式の結果に一致するラベル値を持ったwhen節が実行されます。 request { case name+(i+1) { when "Pentium3","Pentium4" "Pen!!!は1999年、Pen4は2000年発売発売。" when "Pentium5"-"PentiumX" { "まだ無い。" } others "分からない。" } } whenに記述するラベル値は必ず即値でなければなりません。変数や関数、演算子を含む数式は記述できません。 when、othersが処理する{ }内にスクリプトが1つしか存在しない場合は、ifと同様に{ }を省略できます。 switchによる分岐†{ }内の出力候補から出力は無作為に選ばれますが、switchを使用すると選択する候補をを位置で指定できます。 request { switch id { "idは0である。" "idは1である。" { "idは2である。" "idはtwoである。" } "idは"3である。" } } 変数idの値によって出力される文字列が指定されます。指定は0オリジンです。 request { switch 1 { "かわいい" "天才" "サル" -- "とは言い難い" -- "ですね。" "かもしれません。" } } requestの出力は"天才かもしれません。"となります。 ループ†while、for、foreachの3種類のループ構造があります。 基礎設定ファイルのlooplimit でループ回数上限を設定できます。足りない場合は変更してください。標準は10000回です。 while†whileが評価する式が真である間は{ }内を繰り返し処理します。 request { _i = 1 _j = 0 while _i < 11 { _j += _i _i++ } "1から10をすべて足すと%(_j)である。" } 上の例はwhileの機能を簡単に説明しています。 下の例では異なる10個の文字列を発生しています。requestの出力は、1~10のうちいずれかの平方根を報告する文字列です。 request { _i = 1 while _i < 11 { "%(_i)の平方根は%(SQRT(_i))である。" _i++ } } for†forはwhileと同様の先判定ループ構造ですが、初期化式、脱出判定式、ループ毎に実行する式を一箇所にまとめて書ける点が優れています。 以下は、whileで挙げた平方根を報告する例をforで書き直したものです。 request { for _i = 1; _i < 11; _i++ { "%(_i)の平方根は%(SQRT(_i))である。" } } _i = 1はループを始める直前に実行されます。_i < 11はループ判定式で、これが真である間はループが続きます。_i++はループの一単位が完了して先頭へ
戻る際に実行される式です。
C言語では for ( ; ; ) とすることで無限ループとできますが、文では各式を省略できません。 for 1;1;1 などとしてください。ただ、whileなら while 1 で済むため、文で無限ループを作る際は、可読性の点からも、動作速度の点からも、whileを使用すべきであると言えます。 foreach†簡易配列、もしくは汎用配列の各要素値を順番に取り出します。 以下では簡易配列の要素値を取り出して数値へ変換し、すべての合計を計算しています。 request { _str = "1,3,5,7,9" _t = 0 foreach _str; _i { _t += TOINT(_i) } _t } foreachに続いて処理対象を記述します。上の例では簡易配列_strを指定しています。次に書かれた_iは取り出された要素値を格納する変数で、これは 必ず変数でなければなりません。 処理対象の変数のデリミタがSETDELIMによって変更されていても、foreachはそのデリミタを認識して正常に動作します。 foreachは汎用配列も処理できます。 request { _sent = ("I", "am", 31, "years", "old.") _t = "" foreach _sent; _i { _t += (_i + " ") } _t } requestは"I am 31 years old. "を出力します。 foreachループ内において要素取り出し対象の簡易配列、汎用配列を書き換えてもかまいませんが、その場合でも列挙は書き換え前のデータを対象とします。 break†ループ中にbreakが現れると、現在実行中の最も深いループから脱出します。 request { _j = 0 for _i = 0; _i < 100; _i++ { _j = _i*_i if _j >= 100 break } _i - 1 } 上の例では、forは初期値0の_iが100に達するまでループを実行しようとします。しかし、ループ内には「_i を二乗した結果が 100 を越えたらループから抜ける」ようにbreakが仕込まれています。したがって、実際には _i = 10 の時点でループが終了します。
requestは_iから1を減じた価を返しています。つまりrequestは、二乗した結果が100を越えない最大の整数を求める関数です。 continue†ループ中にcontinueが現れると、その位置からすぐにループ先頭へ戻ります。 request { _j = "" for _i = 0; _i < 3; _i++ { _j += "go " if _i > 0 continue _j += "ahead " } _j } _iは0、1、2と変化しますが、1、2ではcontinueが働くので、_jに"ahead"を追加する式が実行されません。 return†returnが現れると、その関数の実行はそこで終わります。 to_rad { if GETTYPE(_argv[0]) == 3 { -1 return } _argv[0]*2.0*3.14/360.0 } 関数to_radはdegreeをradianへ変換します。 |
最終更新日: 2021-11-21 (日) 04:59:43
|