チュートリアル8: モジュール
モジュールとは
Amberにおけるモジュールとは複数の変数定義をひとまとまりにして扱う為の機能です。
全ての変数定義は必ず何らかのモジュールに属します。
Amberのプログラムは常に何らかのモジュールの内部で実行されます。このモジュールをカレントモジュールと呼びます。そして、変数定義・関数定義により定義された変数はその時点でのカレントモジュールに登録されます。起動時のカレントモジュールはGlobalという物になっています。
新たなモジュールを作成し、そのモジュールに実行を移すには
module モジュール名 {
文1
文2
...
}
と記述します。文1,文2,…はそのモジュール内で実行されます。例えば
module A {
x: 0
f(): 1
}
と記述するとA
という名前のモジュールが生成され、変数x
とf
の定義はこのモジュールに登録されます。
あるモジュールの内部の変数を参照する為には
モジュール名 :: 変数名
と記述します。例えば以下の例の様になります。
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の評価器(インタプリタやコンパイラ)に関する定義が含まれています。
Syntax
とSemantics
は言語の構文論と意味論の核を担っています。
Std
(Standardの略)以下のモジュールは標準モジュール