コンテンツにスキップ

フロー制御

条件分岐

if / elseif / else 構文

式の結果が真であれば { } ブロックが実行される。複数の elseif を連結でき、末尾に else を付けられる。ネストした if 文以外では、ブロックが1文の場合は波括弧を省略できる:

if 条件式
{
  // 真の場合
}
elseif 別の条件式
{
  // 別の条件が真の場合
}
else
{
  // すべて偽の場合
}

case / when 構文

ラベルベースの分岐。case 文が式を評価し when ラベルにマッチする。1つの when にコンマ区切りで複数の値を指定できる。範囲指定はマイナス記法(例:"value1"-"value5")。others 節でマッチしなかったケースを処理する。ラベル値はリテラルのみで、変数や式は使えない:

case 式
when 値1
{
  // 値1の場合
}
when 値2, 値3
{
  // 値2または値3の場合
}
others
{
  // どれにもマッチしない場合
}

switch 構文

位置(0始まり)で出力候補を選択する。switch 内のネストした { } でその位置のランダム選択を行える。出力確認マーカー(--)で候補のグループを指定し位置を正確に制御できる。

ループ構造

while ループ

式が真である間 { } ブロックを繰り返す。条件式にカッコは使えない:

while 条件式
{
  // 処理
}

for ループ

初期化・条件・インクリメントの3つのパートを持つ。C言語と異なり、すべてのパートが必須。for ( ; ; ) のような無限ループは使えない:

for 初期化 ; 条件 ; インクリメント
{
  // 処理
}

foreach ループ

配列要素(簡易配列・汎用配列いずれも)を順番にイテレートする。SETDELIM で設定したカスタムデリミタを認識する:

foreach 配列 ; 変数
{
  // 変数に要素が格納されて実行
}

Tc600-3以降では、ハッシュも foreach で回せる。変数には値がキーの順に入る。値が配列やハッシュなら、変数も配列やハッシュになる。

2変数の foreach(Tc600-3以降)

変数をコンマで区切って2つ書くと、1つ目にキー、2つ目に値が入る。配列と簡易配列でも使え、その場合の1つ目には 0 から始まるインデックス(整数)が入る:

foreach 配列またはハッシュ ; キー変数, 値変数
{
  // 処理
}
_h = IHASH("a", 1, "b", 2)
foreach _h ; _k, _v { _s += _k + '=' + _v + ' ' }   // "a=1 b=2 "
foreach ("p", "q") ; _i, _v { ... }                  // _i = 0, 1
foreach "x,y" ; _i, _v { ... }                       // 簡易配列も同じ

変数にはローカル変数とグローバル変数のどちらも書ける。変数が3つ以上のとき(_a, _b, _c)や、変数でないものを書いたとき(_k, 1、_a + _b)はエラー E0043 になる。

break / continue

  • break: 現在のループを即座に抜ける
  • continue: 次のループ反復にジャンプする
  • ループ上限は設定可能。超過すると shiori.OnLoopLimit() が呼ばれる

関数の戻り値

return で関数実行を即座に終了する。出力はそれまでに蓄積された候補から抽出される。

引数つき return(Tc573-1以降)

return 式 の形で戻り値を明示できる。引数には定数だけでなく数式も書ける:

to_rad
{
    if GETTYPE(_argv[0]) == 3 {
        return -1
    }
    return _argv[0]*2.0*3.14/360.0
}

引数つきの return は、それまでに蓄積した候補をすべて破棄して指定した値に置き換える。以下の例では返り値は必ず "D" になり、"A" "B" "C" は破棄される:

test_func
{
    "A"
    "B"
    "C"
    return "D"
}