peek/poke/constant

bjam_grammarに以下のルールを追加しました。

  • pathモジュール(make/glob)
  • project-rulesモジュール(glob/path-constant/constant)
  • modulesモジュール(poke/peek)


以下、実装していて分かったpeek/poke/constantの解説です。
modules.peekとmodules.pokeはモジュール・ローカル変数を読み書きするルールです。
実装はこうなっています。

rule poke ( module-name ? : variables + : value * )
{
    module $(<)
    {
        $(>) = $(3) ;
    }
}
rule peek ( module-name ? : variables + )
{
    module $(<)
    {
        return $($(>)) ;
    }
}
tools/build/v2/kernel/modules.jam

moduleブロック内はモジュール・ローカルな処理になるので、その中で変数を読み書きしているだけです。
BoostのJamfileで見かける

local HOGE = [ modules.peek : HOGE ] ;

は、モジュール名なしで呼び出しているわけですが、これはグローバル変数へアクセスすることになります。


似たルールにproject-rulesモジュールのconstantがあります。

constant HOGE : hoge ;

これはプロジェクト共有の定数を設定するもので、親プロジェクトで設定しておくと、子プロジェクトのモジュール・ローカル変数領域にコピーされます。($(HOGE)の形式でアクセスできる)
bjam_grammarではプロジェクトの概念がないため、単にグローバル変数に値を設定しています。


なお、constantの亜種であるpath-constantは値をフルパス&ネイティブ化する以外はconstantと同じです。