3imp 読んでみる
微妙な割り込みが入りつつ、なんですが頑張ってみます。EoPL よりこっち優先なカンジなので。
まず heap-based から
3.1 節は流し読み。次に以下の五つのデータ構造が出てきた
- environments
- call frames
- control stack
- closures
- continuations
順に解説が入っている模様。
environments
これは SICP で出てきたナニと同じ形と見て良いのかな。例示されているのは
((lambda (a b) ((lambda (c) ((lambda (d e f) body) 3 4 5)) 2)) 0 1)
という式の環境は
((a b) . (0 1))
が
(((c) . (2)) ((a b) . (0 1)))
になって
(((d e f) . (3 4 5)) ((c) . (2)) ((a b) . (0 1)))
になる、とある。以降が未知の世界か
call frames
- expression field : 戻り先 (??)
- environment field : currently active environment ってどこのだ
- rib field : こっちが lambda の中身?? (言い方微妙
- next frame へのポインタ??
control stack
frame のリストな模様。あ、resemble a linked list って書いてあるので微妙。freme へのポインタなリストって考えときゃ良いのかなぁ。
closures
微妙、と思ったらコードが出てるおかげでなんとなく分かる。
((lambda (x) (lambda (y) (cons x y))) 'a)
が戻す closure は以下のリストになる、との事
((cons x y) ((x) . (a)) (y))
三つ要素があるリスト、とある
((function body) (environment) (list of variable))
という感じらしい。3.5 節では要素が二つになる、との事 (environment and a function body)
continuations
ここは最近とっかかりにぶら下がりかけたという意味では一番微妙かも。って微妙訳かもしれませんが、参考になるので自分メモ
継続は任意の時点からの計算を継続するために十分な情報が入っている closure である。(中略) 継続は current frame への参照 (なので control stack 全体も) を含む特別な closure object だ
tag でナニしても良いがチェックのコストが高い。ので通常の closure と同じ構造を持たせつつ、body に継続が生成された時点のアレやらソレやらを盛り込んでいる、というような記述に見える。このあたり、実装する節でおさらいするしかない世界ッス。とほほほ。