|
モジュールはC++の名前空間に相当する機能である。ただし、C++の名前空間と違い、モジュールは入れ子にすることができない。
# 最初はルートモジュール
# モジュールfooに切り替える
module foo
{
# モジュールbarに切り替える
# モジュールfoo.barではない
module bar
{
}
# ルートモジュールに切り替える
module
{
}
}
通常、他のモジュールのルールは呼び出せないが、ルートモジュールのルールは任意のモジュールから呼び出すことができる。
rule rule_a ( ) { }
module foo
{
rule rule_b ( ) { }
}
module bar
{
# これらはエラー
# rule_b ;
# foo.rule_b ;
# これはOK
rule_a ;
}
ルートモジュール以外のルールを使用したい場合は、組み込みルールIMPORTを用いる。
# 各ルールの定義は上の例と同じ
module bar
{
# モジュールfooのrule_bをモジュールbarに同名でインポート
IMPORT foo : rule_b : bar : rule_b ;
rule_b ; # OK
# モジュールfooのrule_bをモジュールbarにfoo.rule_bという名前でインポート
IMPORT foo : rule_b : bar : foo.rule_b ;
foo.rule_b ; # OK
}
通常、モジュールは「モジュール名.jam」という名前のファイルで定義される。このようなモジュールを使用するには、標準ルールimportを用いる。このルールで読み込まれたモジュール内のルールは、「モジュール名.ルール名」という名前でインポートされる。
# 標準モジュールerrorsをインポートする import errors ; # errorsモジュールのerrorルールを呼び出す errors.error Ooops! ;
importルールには、上記に加えインポートするルールに別名を指定できるオプションがある。
# os.nameをnameという名前でインポート import os : name ; # os.nameをos-nameという名前でインポート import os : name : os-name ; # osモジュール内のルールを全てそのままの名前でインポート import os : * ;
なお、importによって読み込まれたモジュールには「__name__」という名前の変数が定義され、これにはモジュールの名前が代入される。
他のモジュールの変数にアクセスするには、標準モジュールmodulesのpeek/pokeルールを用いる。
# モジュールfooの変数Xの値を現在のモジュールの変数Yに代入 Y = [ modules.peek foo : X ] ; # モジュールbarの変数Zに文字列123を代入 modules.poke bar : Z : 123 ;
ルートモジュールの変数にアクセスするにもpeek/pokeルールを用いなければならない。
# ルートモジュールの変数OSの値を現在のモジュールの変数osに代入 os = [ modules.peek : OS ] ;