プログラミング言語 BeanShell
http://d.hatena.ne.jp/sa-y/20060718 の続き.
実行速度は遅いですが BeanShell の言語自体は結構気に入りました.
ECMAScript 3rd Edition からプロトタイプ継承と標準ライブラリ(ArrayとかRegExpとか)をなくしてさらにシンプルにしたような言語でしょうか.
まさに「Java に対する Shell」という位置付けで作られた言語.こういう視点とか位置付けとか役割を明確にして行なった割り切った設計や実装はとても好きです♪
Scripting Objects
BeanShell では Java オブジェクトではない, BeanShell 内で定義されるオブジェクトを Scripting Objects と呼びます.Scripting Objects は以下のように作ります.
Hoge(){ ... return this; } var hoge = Hoge();
普通のメソッドで最後に this を返しているだけです.
ここでメソッド内の this が何を参照してるのかというとそのメソッドの実行コンテキストみたいです.そのため以下のようにメソッド内のローカル変数を Hoge() の戻り値からアクセスできます.
Hoge(){ int x = 10; return this; } var hoge = Hoge(); print(hoge.x); // => 10
メソッド内でメソッドを定義することもできます.なんかぱっと見クラス定義っぽいですね…
Hoge(){ String name = "World"; void hello() { print("Hello, " + name + "."); } return this; } var obj = Hoge(); obj.hello(); // => "Hello, World." obj.name = "BeanShell"; obj.hello(); // => "Hello, BeanShell."
つまり
- オブジェクト(Scripting Objects) = メソッドの実行コンテキスト
- オブジェクトのプロパティ = メソッドのローカル変数
ってことで兼用してるのでしょうか…?
クロージャをサポートした言語は結構あるけどここまで実行コンテキストをプログラマに対して剥き出しにしてもいいものだろうか…
まぁ言語モデルがシンプルになっていいか.