![]() |
モジュールは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 ] ;