コンテンツにスキップ

変数とスコープ

見えている同名の変数がなければ定義し、あればその変数を更新します。let、mut、:= は使いません。変数は初めから変更可能です。

score = 10;
score = score + 5;
score += 2;
print score; // 17

右辺を評価したあとに、定義または更新します。まだ存在しない変数を自身の初期値に使うことはできません。複合代入の += などは、すでに存在する変数にだけ使えます。

名前: 型 = 初期値; で型を指定できます。省略した場合は初期値から推論します。一度定まった変数の型は変えられません。

total: i64 = 0;
total += 3_000_000_000_i64;
total: i64 = 7; // 同じ型を再び書いても、既存変数の更新
ready = true;
print total, ready;

たとえば、total: i32 = 7; と書き直して型を変えることはできません。変数に格納できる型は i32、i64、bool です。型推論の範囲は型とリテラルを参照してください。

ブロックスコープとシャドーイング

Section titled “ブロックスコープとシャドーイング”

{ ... } はスコープを作ります。そこで初めて定義した変数はブロックの外から使えません。外側に同名変数がある場合は、新しい変数で隠さず、その変数を更新します。

x = 10;
{
x = 20; // 外側の x を更新
inside = 3;
print x, inside;
}
print x; // 20。inside はここでは使えない

代入が外側の変数を更新する点と、for が新しいループ変数を作る点を区別してください。for の変数名と見えている変数名が衝突するとエラーになります。ループの詳細は制御フローにあります。

関数の引数も変更可能なローカル変数です。関数からトップレベルの実行文で作った変数を参照することはできません。必要な値は引数で渡します。

識別子は ASCII の英字・数字・_ で構成し、先頭に数字は使えません。count、_index、item2 は有効です。

予約語は fn、if、else、while、for、in、return、break、continue、print、read、true、false です。

// 行末までのコメント
count = 3;
/* ブロックコメントは
/* 入れ子 */ にできます。 */
print count;

関数名と変数名は別々に解決します。同名であっても、name() は関数、name は変数を指します。関数を変数に格納する機能はありません。関数に具体例を示しています。

実装の参照先: 字句解析、名前解決・型検査。