定数畳み込みを行うと、let
x = 3 in let y = 7 in 10におけるxやyのように、使われない変数定義や関数定義が出てきます。MinCamlでは、これをElim.fで取り除きます。
一般に、e1に副作用がなく、x
がe2に出現していなければ、let x = e1 in e2という式を単なるe2に変換することができます。この「副作用がない」という条件を実装したのがElim.effect、「変数が式に出現する」という条件を実装したのがKNormal.fvです。ただし、副作用が本当にあるかどうかは決定不能なので、「配列への書き込みか、関数呼び出しがあったら副作用がある」と判定しています。
ちなみにKNormal.fvという名前は自由変数(free
variable)という用語に由来します。たとえばlet
x = 3 in x + yという式には二つの変数x,
yがありますが、x
は式の中で整数3に定義(束縛)されているので束縛変数といわれ、yは束縛されていないので自由変数といいます。