## モジュール

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

### .ENVIRONモジュール

OSの環境変数は.ENVIRONモジュールの変数にマップされる。よって、標準モジュールmodulesのpeek/pokeルールを通してアクセスすることができる。また、標準モジュールosのenvironルールも利用できる。

    # 変数homeに環境変数HOMEの値を代入
    home = [ modules.peek .ENVIRON : HOME ] ;
    # 上と同じ効果
    home = [ os.environ : HOME ] ;

### グローバル変数

ルートモジュールの(ローカルでない)変数は特にグローバル変数と呼ぶことがある。bjamの`-s`オプションで設定できる変数はこれである。

また、旧バージョンとの互換性のため.ENVIRONモジュールと同じようにOSの環境変数がマップされる。