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と同じです。