2009-01-04 メモ まずは自由変数を無視して、とりあえず closure を実装しよう。やっと少し手が動かせた。 関数のラベルを値に変換して vector のようにヒープに保存。ポインタにはタグを足しておく。 呼び出すときはポインタからタグを引いてそのポインタの示す値をロードしてさらに関数型に明示的に変換。そして呼び出し。まずはここまで来た。 うーん、今のままだと、「関数呼び出し時の引数の数のチェックはコンパイラじゃなくユーザー(!)が責任を持つ」ことになるような‥。そんな不親切なコンパイラは無い気がする。 眠れないので続き。 クロージャーって概念を聞いて想像するより実装した方がよほど分かりやすい。Wikipedia には「クロージャは典型的には関数コードへのポインタ及び関数の作成時の環境の表現(例えば、使用可能な変数とその値の集合など)を含む特別なデータ構造によって実装される。」とある。まさにそのとおり、と実装しつつある今なら思うが、「関数とそれを評価する環境のペア」とか聞いてもまるで魔法のような仕組みがあると思っていた。 funcall ができるようになった。まだ自由変数を無視しているけれど。 今のところ無駄だけど常にクロージャーを作る。