hamigaki.png

前のページ 上に戻る ホーム 次のページ

モジュール

モジュール
モジュールとルール
モジュールファイル
モジュールと変数
.ENVIRONモジュール
グローバル変数

モジュール

モジュールは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の環境変数がマップされる。


前のページ 上に戻る ホーム 次のページ