LoginSignup
0
0

More than 5 years have passed since last update.

Implementing functional languages を頑張って読む.16日目

Posted at

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を読み直した

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0