D language tutorial

遂にDのバージョンが1.0になりました。そこで今日はD言語を知らない人のためのチュートリアルを書こうと思います。

Hello, world!

古来より言語のチュートリアルは Hello, world! より始めるのだそうです。
Dではこのように書きます。

pragma(msg, "Hello, world!");

pragmaは特殊な関数で、渡される引数によって様々な仕事をします。
出力をする際には、第一引数にmsg、第二引数に出力したい文字列を渡します。
コードを書いたら、早速実行してみましょう。実行にはdmdというインタプリタを使います。
オプションとして、-cを指定しましょう。このオプションの意味はもう少し後で勉強することにして、今はおまじないのような物だと思って下さい。

C:\d>dmd hello.d -c
Hello, world!

変数

Dでは、CやC++同様変数を使うことが出来ますが、若干の制限があります。

  • 代入は宣言時にしかできない。
  • 必ず何らかの値を代入しなければならない。

CやC++では、未初期化の変数や誤った値の代入された変数によって、多くの実行時エラーが引き起されてきました。
Dではそのような間違いを防ぐために、代入を宣言時のみに制限することで、参照透明性を保っています。
変数を宣言するコードは以下のようになります。

const int number = 0;

constは、変数の宣言を表す予約語です。constの次にその変数の型を書き、最後の変数名を書きます。
型は自明な場合、省略することも可能です。

const number = 0;

Dでは、整数型、浮動小数型、文字列型が使えます。

const i = 1; // int
const f = 1.0; // double
const c = "hoge"; // char[4]

変数の参照は、CやC++と変わりません。

const i = 1;
const num = i + 1;

配列

Dの配列は、CやC++の配列に比べていくつかの点で使いやすいものとなっています。
まず、宣言に前置形式を使うことが出来ます。これにより可読性が向上します。

const char str[11] = "C/C++ Style";
const char[7] str_ = "D Style";

素数が明示されていない配列は「動的配列」になります。動的配列は任意の長さを取ります。
配列リテラルには「[...]」を、配列の連結には ~ を使います。

const int[] ary = [1, 2, 3] ~ [4, 5, 6];

文字列は、単なる char 型の配列です。

const char[] str = "This " ~ "is " ~ "String."; 

D言語の配列は長さを保持しているため、CやC++のようなNull文字は必要ありません。

関数

Dの関数定義は、CやC++のそれとは若干異なるものとなります。

template add(int n){
    const add = n + 1;
}

形式としては、「template 関数名(引数){ const 返値型 関数名 = 値; }」となります。
関数呼び出しは以下のように行います。

const six = add!(5);

関数のオーバーロードもあります。

template add(int n : 0){
    const add = 0;
}
const zero = add!(0);

制御構文

CやC++の if のような分岐を表す制御構文として、Dには static if が用意されています。

const num = 11;
static if (num > 10){
    const str = "larger than 10."; 
} else staic if (num == 10){
    const str = "equal to 10.";
} else {
    const str = "less than 10.";
}

Dには、for や while といった制御構文はありません。何故なら変数の値の変更が出来ないので、そういったループを書くことは不可能だからです。
ではDではループを書くことは出来ないのでしょうか?そういうことではありません。関数のオーバーロード再帰呼び出しを使ってループを実現することが出来ます。以下は階乗計算を行うコードです。

template fact(int n){
    const fact = fact!(n-1) * n;
}
template fact(int n : 1){
    const fact = 1;
}