2008-10-26 Diksam暫定公開2008/10/26版
■[Diksam]Diksam暫定公開2008/10/26版
ずいぶん長いことかかってしまいました。2ヶ月ぶりの暫定公開です。
UNIX版:
http://kmaebashi.com/programmer/devlang/diksam_unix_20081026.tgz
Windows版:
http://kmaebashi.com/programmer/devlang/diksam_win_20081026.tgz
ビルトインスクリプトにより単体で実行できるようになったので、一応Windows版バイナリも上げておきます(実行は自己責任で)。
http://kmaebashi.com/programmer/devlang/diksam_20081026.exe
暫定公開しなかった前回時点と比べ、大きく以下の機能が追加されています。
delegateによる関数ポインタの追加
C#流に、以下のように書くことで、「引数としてdoubleを取り、intを返す関数型IntFunc」が宣言できます。ちなみにDiksamでは仮引数名も型の一部なので、引数名はdでなければいけません。
delegate int IntFunc(double d);
こうして型の宣言をすることで、関数を格納する変数が宣言できますし、それに対して関数(への参照)を代入できます。
// 代入対象の関数
int
int_func(double d) {
println("hello");
return 5;
}
// IntFunc型の変数を宣言して…
IntFunc func_p;
// それに上の関数を代入。
func_p = int_func;
// func_p経由でint_funcを呼び出せる。
func_p(0.3);
C#のdelegateとは異なり、Diksamのdelegateはクラスのオブジェクトではありません(内部的にはDVM_Objectの共用体メンバのひとつですが)。よって、初期のC#とは異なり、newとかを使わずに関数名を書くだけで取得できます。ただしC#とは異なり、+=でふたつ以上の関数を登録することはできません。
また、delegate型への代入においては、戻り値は共変、引数は反変です。そういえばメソッドオーバーライドの際いままでのバージョンでは引数等の型チェックを忘れていたのですが(おいおい)、今回、そこも修正しました。
delegate型には、引数と戻り値が合っていれば、メソッドも代入できます。delegate経由でメソッドを呼び出したとき、そのメソッド内ではthisが参照できます。つまり、delegate型の変数にメソッドを代入した際は、その中に、オブジェクトも封入されています。
enum型
以下のようにして列挙型を宣言できます。
enum Color {
BLACK,
BLUE,
RED,
GREEN,
WHITE
};
使う際は、「Color.BLUE」のように書きます。
Diksamにおいて列挙型の内部表現はintです。ただし、intに代入したり、整数として演算することはできません。同じ列挙型同士の代入と比較のみが可能です。比較はなぜか大小比較も可能です(使用頻度高そうなので)。また、左辺に文字列を置いて+で連結すると、文字列表現に変換されます。
その他、do whileを完成させたり、たくさんあったバグ(の一部)を直したりしています。