Amber

A Language for High-Level Programming with Self-Extension

チュートリアル8: モジュール

モジュールとは

Amberにおけるモジュールとは複数の変数定義をひとまとまりにして扱う為の機能です。

全ての変数定義は必ず何らかのモジュールに属します。

Amberのプログラムは常に何らかのモジュールの内部で実行されます。このモジュールをカレントモジュールと呼びます。そして、変数定義・関数定義により定義された変数はその時点でのカレントモジュールに登録されます。起動時のカレントモジュールはGlobalという物になっています。

新たなモジュールを作成し、そのモジュールに実行を移すには

module モジュール名 {
    文1
    文2
    ...
}

と記述します。文1,文2,…はそのモジュール内で実行されます。例えば

module A {
    x: 0
    f(): 1
}

と記述するとAという名前のモジュールが生成され、変数xfの定義はこのモジュールに登録されます。

あるモジュールの内部の変数を参照する為には

モジュール名 :: 変数名

と記述します。例えば以下の例の様になります。

module A {
    x: 0
}

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

また一度モジュールから出た後も、再び同じモジュールに入る事が出来ます。

module A {
    x: 0
}

module A {
    x = 1
}

puts(A::x)  # => 1

モジュールの階層

あるモジュールを定義すると、そのモジュールは定義時点でのカレントモジュールに登録されます。このことによって、モジュール間には親子関係が発生します。すなわち、モジュールは階層をなします。この階層の頂点にはGlobalというモジュールが位置する事になります。

モジュールAの内部でモジュールBを定義した場合、AをBのスーパーモジュール、BをAのサブモジュールと呼びます。 モジュールAの外からAのサブモジュールを参照する為には

A :: サブモジュール名

と記述します。例えば以下の例のようになります。

module A {
    module B {
        x: 0
    }

    puts(B::x)  # => 0
}
puts(A::B::x)   # => 0

標準で用意されているモジュール

Amberはいくつかの標準的なモジュールを起動時に生成します。それらの階層は以下の様になっています。

Global -+- Syntax --+-- Action
        |           |
        |           +-- Shell
        |
        +- Semantics --+-- Interpreter
        |              |
        |              +-- Compiler
        |
        +-- Std --+-- Numeric --+-- Integer
                                |
                                +-- BigInt

Syntax以下のモジュールにはAmberの文法に関する定義が含まれています。 Semantics以下のモジュールにはAmberの評価器(インタプリタやコンパイラ)に関する定義が含まれています。 SyntaxSemanticsは言語の構文論と意味論の核を担っています。

Std(Standardの略)以下のモジュールは標準モジュール