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
一旦まだ考えない。