-
Notifications
You must be signed in to change notification settings - Fork 0
**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
の変換処理はf
がknowns
に含まれるかどうかで分岐する。
含まれる場合、f
およびargs
をvarmap
に従って置き換える。
含まれない場合、f
を対応するクロージャが代入された変数f'
に置き換える(これもvarmap
に従って行われる)。
f'
から関数本体fn
と環境env
を取り出すコードを挿入し、Apply fn (env : args')
を返す。
ここでargs'
はargs
をvarmap
に従って置き換えたものである。