クロージャ変換
オリジナル版ではクロージャ変換は無駄に簡潔に書かれています.失敗しうる計算と可変状態を用いてコードゴルフが行われています.
mincaml-rsでは,このプロセスの「失敗しうる」部分を事前に解析することで,他の処理と同じように記述しています.
analyze_let_rec
関数定義に対し,その関数をクロージャとして扱わなくともよいかどうかを解析します.自由変数を持たず,関数が値として使われていない場合はクロージャを形成する必要がありません.また,自由変数を持たない場合は値として使われていても関数内部では直接関数を呼び出すことができます.
オリジナル版における失敗しうる部分は実は一つしかなく,以降でこの関数が変数として扱われていないことを確かめる箇所です.これはクロージャ生成後のこの定義以降の式の自由変数を計算することで調べていますが,それはクロージャ変換前と変わらないはずです(クロージャ変換においてそれ以外のことをすべきでないからです.オリジナル版は不要なクロージャの除去までしているためクロージャ変換前後で自由変数が変わる可能性があります).この部分を事前に計算するのがこの関数ということです.実装の詳細はdoc commentを読んでください.
オリジナル版同様,自由変数を持たないが後から変数として参照されるものは,その関数外ではクロージャとして扱う一方で,定義する関数内では直接呼び出します.