15日目
やるき
Applying a supercombinator
Rule 2.2ってなんだっけ.
a0 : a1 : ... : an : s | d | h[a0 : NSupercomb [x1,..., xn] body] | f |
---|---|---|---|
ar : s | d | h | f |
where (h, ar ) = instantiate body h f [x1 → a1, ..., xn → an]
instantiateってなんだっけ.
あとででてくる.
scのbodyをinstantiateして,引数の名前をスタックの中で見つけた変数のアドレスに束縛して,redexのrootを含むスタックの引数を取り除いて,簡約された結果をスタックにプッシュする.
scStepの定義のイコール部分だけを見ると確かにその通りになっている.
下のwhereの部分が難しい.
new_heapとreslt_addrの詳細はまだinstantiateで隠されている.
envで環境を渡す.いわゆるシャドウイングを出来るようにするのと,変数を見つけられるようにする.
arg_bindingsはgetargsとarg_namesで引数の名前と実体との束縛関係を作る.
getargsの実装は,補助関数のget_argがわかってないからわからん.
scが定数の場合は簡単で,何も考えずに定数をヒープに乗っける.
適用の時はe1とe2についてそれぞれ再帰的にinstantiateする.
まず,e1,すなわち適用される側の式についてinstantiateして,新しいヒープと簡約結果を得る,その後,そのヒープに対してe2,すなわち適用する側の式をinstantiateすれば,最終結果のヒープと簡約結果が得られる.
このヒープに対してこれらの簡約結果を乗っけたものが最終結果となる.
変数だった場合は環境から名前のアドレスを探して帰すだけ.
letやconstrの実装は後で.
とりあえずこれで数字と適用と名前解決だけは出来るようになった…のか?
2.3.5まで読んだ