English

制御構文

LuneScript のプログラム制御フローを記述するための構文について説明します。

if 文

条件分岐を行います。elseifelse ブロックを続けることができます。

let val = 10;
if val == 1 {
    print( "val is 1" );
} elseif val == 10 {
    print( "val is 10" );
} else {
    print( "other" );
}

LuneScript では、式の結果が nil または false の場合に「不成立」とみなされます。それ以外はすべて「成立」です。

bool 値に対して == true== false で比較することは推奨されません。 if expif not exp のように記述してください。

switch 文

値による分岐を行います。Lua にはない構文ですが、LuneScript ではサポートされています。

let val = 1;
switch val {
    case 1 {
        print( "One" );
    }
    case 2, 3 { // 複数の値を指定可能
        print( "Two or Three" );
    }
    default {
        print( "Other" );
    }
}

Enum との連携: 条件式が Enum 値の場合、コンパイラはすべてのケースが網羅されているかチェックします。すべてのケースが記述されている場合、default は到達不能とみなされ、記述すると警告になります(フェイルセーフとして記述したい場合は _default を使用します)。

match 文

alge 型の値に対してパターンマッチを行い、値を取り出して分岐処理を行います。

alge Result {
    Val( int ),
    Err( str ),
}
fn check( res: Result ) {
    match res {
        case .Val( val ) {
            print( "Success:", val );
        }
        case .Err( msg ) {
            print( "Error:", msg );
        }
    }
}

alge 型についての詳細は 値と型 の章を参照してください。

while 文

条件が成立している間、ループを繰り返します。

let mut val = 0;
while val < 5 {
    print( val );
    val = val + 1;
}

無限ループを作成する場合は、while true { ... } を使用します。この true はリテラルである必要があります(定数変数などは不可)。

repeat 文

条件が成立するまで(不成立の間)、ループを繰り返します。ブロックの実行後に条件判定が行われます。

let mut val = 0;
repeat {
    val = val + 1;
} val >= 5;

ブロック内で宣言された変数を、終了条件式で使用することができます。

repeat は将来的に廃止される可能性があります。

for 文

数値範囲でのループを行います。

// 1 から 10 まで 1 ずつ増加
for i = 1, 10 {
    print( i );
}

// 10 から 1 まで -1 ずつ増加(減少)
for i = 10, 1, -1 {
    print( i );
}

形式は for 変数 = 開始値, 終了値 [, ステップ] { ... } です。ステップを省略した場合は 1 になります。

foreach 文

コレクション (List, Map, Set) の要素を反復処理します。

let list = [ 10, 20, 30 ];
foreach val, index in list {
    print( index, val ); // 1 10, 2 20, 3 30
}

let map = { "a": 1, "b": 2 };
foreach val, key in map {
    print( key, val );
}

apply 文

Lua のイテレータ関数を使用する場合に使います(Lua の for in 相当)。

apply txt of string.gmatch( "a.b.c", "[^%.]+" ) {
    print( txt );
}