R6RSのライブラリの「レベル」指定はなぜ必要か? その3 - Scheme VM を書く
メモ。考えまとまらず。
疑問その1 - ライブラリ群をプリコンパイルする事は可能か?
ライブラリ群をプリコンパイルする事は可能か?
全てのライブラリが run で import されるなら可能だと思う。
ただし expand で import される場合は微妙。なぜならばコンパイル時に他のライブラリのインスタンス化が行われるのでそれらが全ての関連するライブラリで共有されないと矛盾しそうだから。
いや待てよ。もしかしてR6RSの7章の
Thus, a library whose meaning depends on whether
the instances of a library are distinguished or shared across
phases or library expansions may be unportable.
の記述がまさにいま話題にしているケースのことかな?。
もしそうならば、ライブラリ群のプリコンパイルは可能であるということになる。
疑問その2 - 式のコンパイル/評価の順序について
R6RS を読んで素直に思いついた VM としてのコンパイル/評価の順序は以下のようなものだ。これは正しいだろうか?。(上述のプリコンパイル作戦は何か気持ち悪さがある。)
トップレベルプログラムをパース/コンパイル/実行していく。
- (library ...) の記述が現れたら、ライブラリ名とライブラリの情報を組にして記録するこの時点でライブラリの本体はコンパイルされない
- (import ...) が現れたら該当するライブラリの情報を記録から取り出し本体をコンパイルし VM 上で実行する。
- そのライブラリが別のライブラリをインポートしている場合 for で指定された依存関係に応じてそれらのライブラリの本体をコンパイルし VM 上で実行する。
- もしも2つ以上のライブラリからインポートされるライブラリがあった場合はコンパイルと実行は1度に限るように VM が調整する。
こんな感じか。