Skip to content

**OUTDATED** クロージャ変換

Yuya Kono edited this page Jan 25, 2021 · 1 revision

OUTDATED

クロージャ変換に至るまでの処理により、中間表現は次のような性質を持つ:

  • 同名の変数が2回以上宣言されていない
  • 変数に型情報が付加されている
  • 入れ子になった関数定義を持たない

Language.Malgo.MiddleEnd.Closure.transは中間表現Expr (ID MType)を関数宣言の列Program (ID MType)に変換する。

クロージャ変換の処理はReaderT Env (StateT (Program (ID MType)))として構築される。 Envは、クロージャ変換により型や名前が変わった変数の情報varmapと、 クロージャを経由せず直に呼び出せることが分かっている関数の集合knownsを保持する。

変換処理は主に関数transExprで実行される。

Apply f argsの変換処理はfknownsに含まれるかどうかで分岐する。 含まれる場合、fおよびargsvarmapに従って置き換える。 含まれない場合、fを対応するクロージャが代入された変数f'に置き換える(これもvarmapに従って行われる)。 f'から関数本体fnと環境envを取り出すコードを挿入し、Apply fn (env : args')を返す。 ここでargs'argsvarmapに従って置き換えたものである。

Clone this wiki locally