D.NETを試す

D.NET 0.95.90 Released
以前の日記で取り上げたD.NETですが、動かせる環境が用意できたので弄ってみました。まだ、Pre-Alpha Releaseなので雰囲気をつかむくらいですね。

// test.exeが生成される
pragma (AssemblyInfo, "test", "exe");
// .NETアプリなら必須
extern (CLI):

public static void sum(int[] arr) {
    System.Console.WriteLine("sum:array.length = {0}", cast(__box)(arr.length));

    int n = 0;
    for (int i = 0; i < arr.length; ++i) {
        n += arr[i];
    }
    // return n;
    // 戻り値があると関数を呼び出した途端に例外
}

public static void main() {
    System.Console.WriteLine("Hello D.NET!");

    int[10] arr;

    sum(arr);
    // > sum:array.length = 0
    // 配列要素が渡せていない

    System.Console.WriteLine("array.length = {0}", cast(__box)(arr.length));
    // > array.length = 10
    for (int i = 0; i < arr.length; ++i) 
        arr[i] = (i + 5);

    System.Console.WriteLine("array.length = {0}", cast(__box)(arr.length));
    // > array.length = 10

    // sum(arr);
    // > sum:array.length = 1 
    // なぜか要素数が1になってアクセス違反で落ちる

    arr[0..arr.length] = 10;
    System.Console.WriteLine("array.length = {0}", cast(__box)(arr.length));
    // > array.length = 10

    sum(arr);
    // > sum:array.length = 0
    // ここでは落ちない
}

戻り値のある関数(というか関数なら戻り値はあるだろ)を定義すると呼び出し時点でアウト、int main()とかすると最初から動きません。また、配列がうまく関数に渡ってない気がします。D言語をわかってないので*1、D.NETに問題があるのか、言語的にありえない書き方をしているのが分からなくて苦労しました。(^^;

あと、はまったところを羅列。

  • DNET.exeと同じディレクトリにtestlib.dllも置く
  • pragma (AssemblyInfo, "test", "exe");を書く
  • extern (CLI):を書く
  • 今のところ戻り値はvoidにする
  • グローバル関数にはstaticをつける
  • foreachは使えないみたい

まだまだ、開発が始まったばかりなので今後に期待かな。ToDoリストにあったInline ILとか面白そ。(^^;

*1:YaneSDK4DをC#に移植するためにソース見ただけ