====== 変数と定数 ======
数値や文字列といった値に名前を付けるには、変数、あるいは定数を利用します。変数はミュータブルで、後で変更することができます。イミュータブルな変数はサポートされていません。定数はコンパイル時に評価される値であるという点で、変数とは異なります。定数は後から変更することはできません。
====== 変数 ======
変数を使用するには、まずその変数を宣言する必要があります。
x: int
これでint型の値を保持することが出来る''x''という名前の変数が使えるようになります。上のように初期値を指定しなかった場合、0で初期化されます。
x: int
assert(x == 0)
宣言と同時に初期値を与えることもできます。
x: int = 99
assert(x == 99)
このようなパターンは頻出するので、簡潔な書き方が用意されています。次のコードは上のコードと同等です。
x := 99
assert(x == 99)
''x''の型は明示されていませんが、右辺の値の型から導出されます。
'':''と''=''は個別のトークンであり、くっついていなくてもほぼ同じ意味になります。
x1 : = 99
x2 : int = 99
assert(x1 == 99)
assert(x2 == 99)
同じ型の複数の変数をまとめて宣言することができます。
x1, x2: int
assert(x1 == 0)
assert(x2 == 0)
初期値を与えることもできます。
x1, x2: int = 100, 200
assert(x1 == 100)
assert(x2 == 200)
一つの変数を宣言する場合と同様に、型名は省略できます。
x1, x2 := 100, 200
assert(x1 == 100)
assert(x2 == 200)
型名を省略する場合は、異なる型の変数を宣言できます。
x1, x2 := 100, "hello"
assert(x1 == 100)
assert(x2 == "hello")
型を明示する場合は、異なる型の変数をまとめて宣言することができません。次のように書くことはできません。
x1, x2 : int, string = 100, "hello" // コンパイルエラー!
この点において、型名を省略した書き方のほうが明示的に書くよりも柔軟性があると言えます。
変数の宣言と同時に初期値を与えるケースは多くあり、また、その変数の型は初期値から明らかな場合が多いです。そのため、型名を省略した書き方を用いる場合のほうが多くなることが多くなります。明示的に型名を書くのは、そうすることによって意図が明らかになり、コードが読みやすくなる場合に限られてくることになります。
====== 定数 ======
プログラム全体を通して変わらない値に名前を付ける場合は、変数よりも定数とする方が適しています。定数は宣言時に値を設定する必要があり、設定された値を後で変更することができません。
定数の宣言は次のようになります。
THE_ANSWER : int : 42
変数の場合と同じように、型名は省略することができます。
THE_ANSWER :: 42
定数の値はコンパイル時に評価できる値でなければなりません。したがって、次のコードはコンパイルされません。
circumference := 6.28318530717958647692
radius := 1.0
PI :: circumference / (2.0 * radius) // コンパイルエラー!
PIの値に計算が含まれていることが原因ではありません。''circumference''と''radius''は変数であり、コンパイル時には値が定まらないため、それに依存して定数を宣言することはできないからです。
一方、次のコードは正しいです。
TAU :: 6.28318530717958647692
PI :: TAU / 2.0
先の例と同様にPIの値に計算が含まれていますが、そこに含まれるすべての値(''TAU''と''2.0'')がコンパイル時に評価可能であるため、PIの値もコンパイル時に評価可能です。よって、正しくコンパイルされます。