Amber

A Language for High-Level Programming with Self-Extension

チュートリアル2: 変数

変数の定義と使用

Amberで変数を定義する場合には記号:を用いて

シンボル: 値

という文法で記述します。例えば次の様になります。

x: 0
y: "foo"

変数を定義するとその変数名(シンボル)と値が結び付けられ、シンボルを評価させると結びついた値が得られます。

x: 1
puts(x + 1)     # => 2

変数の書き換え

変数に結び付けられた値を変更する(破壊的代入を行う)には記号=を用います。

x: 0
x = 1
puts(x)     # => 1

他のスクリプト言語には変数の定義文が必要ないものもあります。 それに比べて、変数を使用する度に定義文を一度書かなければならない仕様は煩わしく感じるかもしれません。しかし、定義文を用いない場合には次の節で述べる変数のスコープを表現する為に

  • 変数名によって識別する
  • 何らかの宣言文を記述する

などの工夫が必要となります。そしてこれらの仕様は「プログラムをデータとして取り扱う」事を多少なりとも面倒にします。Amberでは積極的にプログラムを通常と同様に扱いますので、定義文を利用して変数のスコープを表現する方法を採用しました。この点に関する詳しい考察については、別のページでいずれ行いたいと思います。

変数のスコープ

if文やwhile文などの制御構造を用いたり、関数を定義したりすると新たなスコープが生じます。変数の定義を行うと、定義された変数は定義を行った場所でのスコープに登録され、そのスコープの内部からのみ参照を行う事が出来ます。 どのような場合にスコープが生じるかについては、今後のチュートリアル及びリファレンスにて説明しますが、最も簡単にスコープを作成する為には記号{}で文を囲めば良いです。記号{}で囲まれた箇所をブロックとも呼びます。 

{
    x: 0
    puts(x)     # => 0
}
puts(x)         # => Error: UndefinedVariable

同一のスコープ内で、同じ名前の変数を複数回定義することはできません。

x: 0
x: 1        # => Error: RedefinedVariable

複数のスコープを入れ子にしている場合は、内部のスコープから外部のスコープで定義された変数を参照する事が出来ます。

x: 0
{
    puts(x)     # => 0
}

入れ子になった外と内のスコープで同じ名前の変数を定義した場合には、内側のスコープでの定義の方が優先されます。またこの場合、外側のスコープで定義された変数の値が変わってしまうという事はありません。

x:0
{
    x: 1
    puts(x)     # => 1
}
puts(x)         # => 0

この他に、モジュールという物を利用するとスコープをより柔軟に取り扱う事が可能になります。詳しくは後の回に説明します。

シェル専用の一時変数

Amberのシェルモードにおいては記号%及び%番号によって、過去の計算結果を読み出す事が出来ます。%は直前の結果、%Namber:N>という行の結果を格納する変数(厳密には変数ではありませんが)です。これらによってAmberのシェルを電卓のように手軽に使う事が出来ます。

amber:1> 10
=> 10
amber:2> % * 2
=> 20
amber:3> %1
=> 10
amber:4> %2
=> 20