制御構文
LuneScript のプログラム制御フローを記述するための構文について説明します。
if 文
条件分岐を行います。elseif や else ブロックを続けることができます。
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 exp や if not exp のように記述してください。
switch 文
値による分岐を行います。Lua にはない構文ですが、LuneScript ではサポートされています。
let val = 1;
switch val {
case 1 {
print( "One" );
}
case 2, 3 { // 複数の値を指定可能
print( "Two or Three" );
}
default {
print( "Other" );
}
}
caseには複数の値をカンマ区切りで指定できます。breakは不要です(自動的にブロックを抜けます)。default節ですべてのケースを網羅していない場合の動作を記述します。
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 );
}
List:val, indexの順で受け取ります。Map:val, keyの順で受け取ります。Set:valのみ受け取ります。- インデックスやキーが不要な場合は省略可能です:
foreach val in list { ... } - Map や Set の列挙順序は不定です。順序を保証したい場合は
forsortを使用します。
apply 文
Lua のイテレータ関数を使用する場合に使います(Lua の for in 相当)。
apply txt of string.gmatch( "a.b.c", "[^%.]+" ) {
print( txt );
}