このページの内容

変数

変数は、値を保存するための名前付きのスロットです。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

左辺が単なる変数名より複雑な式なら、これは代入ではありません。代わりに、セッターメソッドを呼び出しています。



関数 →← 制御フロー