SELFの一番面白い部分は、メソッドやクロージャもスロットであること
JavaScriptがらみでSELFの話はよく出るけど、でも中身はほとんど話題にならないのはいつものことだったりしてる(SELFに限ったことではないが)。
SELFではオブジェクトは「スロット」と呼ぶkey-valueのMapになっている。
- スロット自体にkeyに対するものがない場合、*つきキーの参照先スロットでもそのkeyを探索するようになっている
- オブジェクト生成は、スロットのclone(基本的にはシャローコピー)になっている
これがプロトタイプと呼ばれる機能であるが、今となっては比較的一般的な概念だと思う。
SELFが面白いのはむしろ、この10ページ11ページ目にある、クロージャやメソッドの意味づけとその処理の仕方だろう。
- 環境もクロージャーもスロット。
- クロージャのローカル変数は、スロット生成時に作られる参照と代入メソッド(スロット)として表現される
- クロージャのparent*はレキシカルスコープでの親スロットになっている
- メソッドも同じようにスロット
- メソッド実行はメソッドスロットをコピーして、引数とターゲット(self*)をコピーしたスロットに入れて実行
Rubyだとmethod_missing(変数やスロットアクセスはすべてここ)とblock構文(コード代わり)%{}でネスト可能なコード文字列で、利用はほぼrubyコードの表現でこれに似たメソッド処理の仕組みを表現できる。(実装を書いたサイトはもう消えてしまった。「SeRuby」でググればそれを参照した記事がちょっと出てくる、最終的にはinstance_evalだろうけど、クロージャの仕組みどうしてたっけ)。
javascriptだとfunctionは明記する必要があるし、プロパティも入れ替えなくてはいけない(もしくはメッセージ呼び出しを全部特殊にするか)から、難しいかな。