コンテンツにスキップ

制御構文

Ceruneは条件分岐にif、繰り返しにwhileとfor、直和型(enum)の分岐にmatchを使います。

ifの条件はbool型です。elseは省略できます。

value: i64 = 7;
if value < 10 {
print(value);
} else {
print(10);
}

ifは文です。 現在はif全体から値を返す式としては使えません。条件に数値を直接指定することもできません。

whileは、本文の実行前に毎回boolの条件を評価します。最初からfalseなら本文は実行されません。

mut count: i64 = 0;
while count < 3 {
print(count);
count = count + 1;
}

通常のforには、初期化・継続条件・更新の3つをすべて記述します。

mut total: i64 = 0;
for (mut i: i64 = 0; i < 3; i = i + 1) {
total = total + i;
}
print(total); // 3

初期化は最初に1回、継続条件は各反復の前、更新は本文を最後まで実行した後に評価します。初期化で宣言した名前はループ内だけで有効です。初期化には既存のmutな束縛への代入も使えます。

固定長配列と動的配列を、先頭の要素から順に処理できます。

values: [i64; 3] = [4, 7, 9];
for (index: i64, value: infer in values) {
print(index);
print(value);
}

添字が不要ならfor (value: infer in values)と書けます。対象式はループ開始時に一度評価され、配列全体がコピーされます。元の配列の変更は、そのループで処理する要素に反映されません。各反復で取り出す要素も値コピーです。

配列の型やコピーの規則は配列を参照してください。

  • break;は最も内側のループを終了します。
  • continue;は現在の反復を終了し、次の反復に進みます。
  • whileのcontinueは次の条件評価へ進みます。
  • 通常のforのcontinueは更新文を実行した後、条件を評価します。
  • for … inのcontinueは次の要素へ進みます。

breakとcontinueはループ外では使用できません。外側のループを指定するラベル付きの形式は未実装です。

matchはenumの選択肢に応じて処理を分けます。対象を一度評価・コピーし、分岐を記述順に調べます。

enum Lookup { Found { text: string }, Missing }
value: Lookup = Lookup::Found { text: "結果" };
match value {
Lookup::Found { text: text } => { print(text); },
Lookup::Missing {} => { print("未登録"); },
}

matchは文と式の両方に対応します。文の分岐は=> { 文... }、式の分岐は=> 式です。式の場合は、すべての分岐結果の型を揃えます。

label: string = match value {
Lookup::Found { text: text } => text,
Lookup::Missing {} => "未登録",
};

パターンの後にif 条件を付けて、boolのガードを指定できます。ガードは対応する選択肢が一致した場合だけ評価されます。すべての選択肢にガードなしの分岐が必要です。全体ワイルドカードや入れ子パターンは現時点では未対応です。

&&と||は短絡評価します。左辺だけで結果が決まる場合、右辺は評価しません。

count: i64 = 0;
print(count != 0 && 12 / count > 2); // false

各ブロックは新しいスコープを作ります。ブロックの中で宣言した束縛は外から見えません。詳細は変数と束縛を参照してください。

このページは仕様の要約です。正確な評価順、matchの網羅性、各分岐の制約は言語リファレンス(一次資料)を参照してください。