Gauche の $if の最適化 - Scheme VM を書く
if ではなくて $if なので注意。
Scheme の and や or などでは最後に評価した test clause の結果を返します。
この最後に評価した test clause ってのが $it です。
アナフォリックマクロで言えばずばり it のことですね。
これは通常の Scheme の if ではでてきませんが、and や or などでは裏ではそういう概念が存在すると考えるとうれしいですよと。
it は then とか else の中に出てくる。
例えば (and a) は擬似コードで
(if a it #f)
と書けます。
何がうれしいの?
さて $it があると何がうれしいのかは Gauche の compile.scm のコメントにいくつか例が載っています。
(1)($if ($if <test0> <then0> <else0>) <then1> <else1>) (2)($if ($if <test0> ($it) <else0>) <then1> <else1>)
(2) がうれしいパターンなのですがみるべきポイントが
- (1) と比べて (2) では内側の $if の then が $it になっている
という点です。
ちょっと難しいのですが (2) ではもしも
つまり
これと比較して通常パターンの (1) では
結局、直前の test 評価の結果を次の分岐で直接使うような場合に不要な評価を1つ削れるということですね。
今日は時間がないのでここまで。続きは明日。