16日目
(大嘘)
Applying a supercombinator
忘れてたので読み直した.
15日目に書いたことに間違いを見つけたので正しい理解を得る.
envで環境を渡す.いわゆるシャドウイングを出来るようにするのと,変数を見つけられるようにする.
間違い.
このCore Language にはグローバル環境しか無いので,単に変数の検索を行うための環境を渡す.
arg_bindingsはgetargsとarg_namesで引数の名前と実体との束縛関係を作る.
getargsの実装は,補助関数のget_argがわかってないからわからん.
わかった.
NScがスタックトップに有るとき,スタックはこのようになっている.
例えば,f 1 2
という式がスタックトップにあったとすると,
Heap>| Addr | Node | +=========+ stack bottom
| : | : | | Addr 2 | <----- @
| 2 | NAp 5 xx | +---------+ / \
| : | : | | Addr 5 | <--- @ 2
| 5 | NAp 13 yy | +---------+ / \
| : | : | | Addr 13 | <-- f 1
| 13 | NSc ..... | +---------+ stack top
となっているので,hLookup heap addr
でheapからaddrが指してるNodeを探し,(そのNodeはNApのはずなので,)NApのarg側を返す関数がget_arg.
これをstackにmapすれば,スタック上の各NApに対してargのaddrが入っているリストが手に入る,ということをやるのがgetargs.
このgetargsと仮引数のリストarg_namesをzip2すれば,仮引数と置換先の実引数の対応表が作られるので,これをarg_bindingsとする.
適用の時はe1とe2についてそれぞれ再帰的にinstantiateする.
まず,e1,すなわち適用される側の式についてinstantiateして,新しいヒープと簡約結果を得る,その後,その> ヒープに対してe2,すなわち適用する側の式をinstantiateすれば,最終結果のヒープと簡約結果が得られる.
このヒープに対してこれらの簡約結果を乗っけたものが最終結果となる.
間違い.
まずe1をinstantiateし,その後e2をinstantiateする.heap1などの依存関係を見ればわかる.
2.3.5を読み直した