ルールの戻り値

ルール展開とルール名に対する変数展開を実装しました。
今日の差分


ルール展開の仕様を調べていて、ルールの戻り値の扱いが想像していたものとかなり違うことが分かりました。
bjamでは、他のいくつかのスクリプト言語のように最後に評価した式/文/ブロックが戻り地になるようです。

# 第一引数をそのまま返すルール
rule identity return $(1) ;

A = abc ; # 「abc」に評価される

if $(A)
{
    identity 123 ; # 「123」に評価される
}
else
{
    identity 345 ; # ここは評価されない
}
# if文全体では「123」に評価される

ただ、例外があって、for文の結果は常に空リストになります。なぜでしょうね。


また、bjamのreturnはスコープを脱出しないので、

return [ some_rule ] ;

some_rule ;

は同じ意味になりますね。
return文は即値を返すために用意されているのでしょう。


というわけで、bjamのルールの戻り値は必ずルールの最後で設定するようにし、誤って戻り値を上書きしないよう注意が必要です。