読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

3imp 4.1-4.4メモ

Scheme

まず流し読みしてたけど、現時点でもわかったことが多いのでメモしておく。しかし、英語が……英語が……

スタックベースモデルでは、フレームの内容は全て線形にスタックへ積んでいく。

dynamic link はcallerフレームへの、static linkはlexicalフレームへのポインタ。dynamic linkは、スタック直下のフレームなので必要は無い?しかし、特にcontinuation周りでのデバッグが便利になるのかな。

関数適用時のスタックの動きは

  1. dynamic linkと適用後のコードの参照を積む
  2. 引数を順に評価して、値をスタックに積んでいく
  3. static linkを積んで、関数適用

となる。consする必要は無いので、多分前後どちらからでも大丈夫かな。後ろからの方が、コンパイル時のlambdaの引数位置判定に若干有利? 可変長引数をどう処理するのかは謎。

で、スタックなのでstatic linkが指すフレームが上書きされる。よってclosureはこのままでは作れない。

対策としてDisplay Closureを導入する。自由変数を抜き出して、専用のベクタに入れることにする。これでO(1)でアクセスできる。自由変数とベクタのサイズはコンパイル時にわかる。ここのデータ構造が正確にどうなってるか、引数からどう生成するかはまだ読み取ってない。

自由変数をコピーするみたいだけど、そのままだとset!が影響及ぼせないので、多分次章のboxとやらで解決するのかな。set!対象になっている自由変数は最初に生成されたClosure内部への参照になるとみた。

ということで、今AmeLispではMacroとスペシャルフォームのコンパイルを一緒にしてるけど、Macro展開フェーズを分けて、lambdaやifなどだけの状態からコンパイルする必要がある。

広告を非表示にする