コンテンツにスキップ

式・文・ブロック

変数の定義・更新、print、read、return、break、continue、通常の式文は ; で終えます。改行だけでは文を区切れません。

ブロックの最後に ; のない式を書くと、その値がブロックの結果になります。

answer = {
doubled = 4 * 2;
doubled + 1
};
print answer; // 9

末尾式がなく、通常どおり終了するブロックの結果は () です。たとえば { 9; } は 9 を返しません。この末尾式の考え方は Rust のブロック式に沿っています。

文として使う if や { ... } の後ろの ; は省略できます。ただし、answer = { ... }; の最後の ; は代入文を閉じるために必要です。トップレベルの通常の式にも ; が必要です。

代入は文であり、値を返す式ではありません。x = y = 1; のような連鎖代入は使えません。

条件の () は任意です。各分岐の {} は必要です。

x = 8;
y = 5;
larger = if x > y { x } else { y };
print larger;
if (larger > 0) {
print larger;
}

条件は bool、値を返す分岐は同じ型にします。else if で分岐を増やせます。条件と選ばれた分岐だけを評価します。

else がない if の結果は () です。その場合、実行を続ける分岐は整数などの値を返せません。if ready { 1 } は使えず、処理なら if ready { print 1; } と書きます。

分岐の片方が return などで処理を抜ける場合は、その分岐から結果が戻らないため、もう片方の型を結果の型として扱えます。

短い条件分岐は 条件 ? 真の場合 : 偽の場合 で書けます。こちらは {} が不要です。

x = 8;
y = 5;
print x > y ? x : y;
divisor = 0;
print divisor != 0 ? 12 / divisor : 0; // 0。割り算は実行しない

条件は一度だけ評価し、その後は選ばれた側だけを評価します。分岐の型は if と同じ規則です。入れ子は右結合なので、a ? x : b ? y : z は a ? x : (b ? y : z) と解釈します。

通常の二項演算の左右、関数の引数、print の引数は左から右へ評価します。先に読み出したスカラー値は、後続の式が変数を変更しても変わりません。

x = 1;
print x, { x = 2; x }; // 1 2

&&、||、?:、if は必要な部分だけを評価します。print はすべての引数を評価してからその行を出力します。詳細は入出力にあります。

複合代入は「右辺を評価してから、更新対象の現在値を読む」という順序です。演算子の例を確認してください。

ブロック式の中の return はそれを囲む関数から戻ります。ループ本体のブロック式に書いた break・continue は、最も内側のループに作用します。

実装の参照先: 構文解析、型検査、C++ 出力。