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++のそれとは若干異なるものとなります。
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; }