無名クラスを実装しました。局所的な型に名前を付ける手間を省きます。
同じ書式で継承(Java風)と初期化(C#風)を記述できます。
継承
newの後にブロックを付けることで継承します。Javaの無名クラスと同じ書式です。C++/C#/Javaなどと異なりコンストラクタ名が固定のため、無名クラスでもコンストラクタやデストラクタが定義できます。
class Test1 { var value = 1; } var t = new Test1 { function ctor { printfln("value = %d", value); } };
初期化
ブロックでメンバ(変数・関数)を定義しなければ初期化として扱われます。C#と似ていますが構文がやや異なります。ブロックの中は通常のステートメントと同じようにセミコロン区切りでセンテンスを記述します。
class Test1 { var value = 1; } var t = new Test1 { value = 2; } printfln("t.value = %d", t.value);
従来の書き方では以下のようになります。
class Test1 { var value = 1; } var t = new Test1; t.value = 2; printfln("t.value = %d", t.value);
コンストラクタに引数を渡せないため、その代用として使うことを想定しています。ただし初期化ブロックの中から外のローカル変数を参照できません。解決にはレキシカルスコープの実装を大幅に見直す必要があるため、当面は見送ります。