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を完成させたり、たくさんあったバグ(の一部)を直したりしています。

今後は、バグ取りはもちろん、自分のドッグフードを食う意味も含め、そろそろライブラリを作っていかなければなりませんね。