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) ではもしも の結果が #t ならば、$it も自動的に #t ですから 相等の評価を1つ省けます。
つまり => #t ならば外側の $if の test 句はすぐに #t であると決まるのです。
これと比較して通常パターンの (1) では が #t と決まっても を評価しないと分岐の方向は決まりません。


結局、直前の test 評価の結果を次の分岐で直接使うような場合に不要な評価を1つ削れるということですね。


今日は時間がないのでここまで。続きは明日。