変数
変数は、値を保存するための名前付きのスロットです。Wrenでは、次のようにvar文で新しい変数を定義します。
var a = 1 + 2
これで、現在のスコープにaという新しい変数を作り、=の後にある式の結果で初期化します。変数を定義すると、予想どおり名前でアクセスできます。
var animal = "Slow Loris"
System.print(animal) //> Slow Loris
スコープ #
Wrenには本来のブロックスコープがあります。変数は、定義した位置から、その定義があるブロックの終わりまで存在します。
{
System.print(a) //! "a" doesn't exist yet.
var a = 123
System.print(a) //> 123
}
System.print(a) //! "a" doesn't exist anymore.
スクリプトの最上位で定義した変数はトップレベルで、モジュールシステムから見えます。それ以外の変数はすべてローカルです。外側の変数と同じ名前の変数を内側のスコープで宣言することをシャドーイングと呼びます。これはエラーではありません(ただし、頻繁に行いたい操作ではないでしょう)。
var a = "outer"
{
var a = "inner"
System.print(a) //> inner
}
System.print(a) //> outer
同じスコープで同じ名前の変数を宣言することは、エラーです。
var a = "hi"
var a = "again" //! "a" is already declared.
代入 #
変数を宣言した後は、=を使って代入できます。
var a = 123
a = 234
代入では、スコープのスタックを外側へたどって、指定した名前の変数が宣言されている場所を探します。定義されていない変数へ代入すると、エラーになります。Wrenは、暗黙の変数定義を認めません。
より大きな式の中で使う場合、代入式の評価結果は、代入した値です。
var a = "before"
System.print(a = "after") //> after
左辺が単なる変数名より複雑な式なら、これは代入ではありません。代わりに、セッターメソッドを呼び出しています。
関数 →← 制御フロー