defineのコンパイル - masaedw/lisp GitHub Wiki

structure of module

moduleはsymbolとvalueのpairのvectorとする。新しくdefineされたら、末尾にpushする。

module-level define

lambdaの入れ子の環境を一番上まで辿ってもlambdaの引数の中に含まれない自由変数はモジュールレベルにdefineされた変数(モジュール変数)とみなす。

モジュール変数は実行時までにdefineされていれば良いため、まだ存在しないモジュール変数を使用するlambda式は合法。

実行

参照

refer-module n 命令を追加する。n番目のモジュールレベルの変数にアクセスする。値がUnboundの場合はunbound variableエラーを発生させる。

define

assign-module n val 命令を追加する。n番目のモジュールレベル変数にvalを設定する。

コンパイル

参照

localsにもfreeにも存在しないシンボルはモジュール変数とみなし、refer-moduleに変換する。refer-moduleのオペランドを作れるように、モジュール変数が見つかるたびにモジュールに変数を追加していく。値はunbound variableエラーを発生させるためUnboundを設定しておく。

lambdaは自由変数をキャプチャするが、モジュール変数についてはキャプチャしないようにする。

define

assign-module n val 命令に変換する。

internal define

一旦まだ考えない。