D for Haskeller
http://haskell.g.hatena.ne.jp/mr_konn/20061006/1160138831
勿論すごい人の真似な訳ですが。
C++よりDのほうが優れているんだと主張したいので書きます。
対象読者は、ネタをネタと見抜ける人です。
とりあえず「こちら」と比較しながら読みましょう。
const n = 10;
これでnは整数型と推論されます。素晴らしい。
次に連想配列。ブレースの後の「;」とstaticを書かなくていい、という点でC++よりも書きやすくなっています。
struct AssocArray{ const n = 10; const m = n+10; const b = true; }
こんな感じで使います。「::」よりも「.」の方が勿論1byte分優れていますよね。
const z = AssocArray.n + AssocArray.m;
別の名前に束縛する時は、aliasを使います。typedefよりも2byteも短いです。
alias AssocArray AssocArray2;
そして関数。これが素晴らしいです。なんとDの関数は連想配列以外の型も返せます。
template add_int(int n, int m){ const add_int = n + m; }
関数呼び出しは以下のようにして行います。
const n = 10; const m = 20; const o = add_int!(n, m);
「!(...)」という形式は見慣れていないかも知れませんが、しかし「<...>」よりは関数を呼び出している、という感じがするのではないでしょうか。
何より、C++形式では関数の引数に関数の返値を渡してやるときに、
add_int<3, add_int<1,2> >; // >と>の間にスペースが必要!
といった問題がありますが、Dではそのような問題はありません。Dは完璧超絶言語です。
では早速、関数の書き方について説明します。
template // 関数であることを示すキーワード (int n, int m) // 引数は n::int, m::int のふたつ add_int // 関数名 { const add_int // 必ず関数名と同じ名を持つ変数を作り = n+m; // そこに関数の戻り値を代入します }
非常に直感的で、実に分かりやすいですね。素晴らしいです。嗚呼。
勿論パターンマッチも使えます。
template add_int(int n, int m){ const add_int = n + m; } template add_int(int n : 10, int m : 10){ const add_int = 40; }
引数の後ろに「:」をつけて、その後に値を書いてやるだけ!これもC++より理解しやすくて優れていますね。
そして階乗計算。
template fact(int n){ const fact = fact!(n-1) * n; } template fact(int n : 1){ const fact = 1; }
美しい…
そして最後はHello Worldです。
void main(){ printf("Hello World.\n"); }
わーい、やったね!
続け(お願いします)