2013年11月30日土曜日

D言語のTemplateを使ってみる

よくよく考えるとD言語のジェネリクスとかテンプレートとか全然知らなかったので、テンプレートを使って見ました。


最初に書いたのがこれ
import std.stdio;
template fibo(int N)
{
const ulong fibo = fibo!(N-1)+fibo!(N-2);
}
template fibo(int N : 1)
{
const ulong fibo = 0;
}
template fibo(int N : 2)
{
const ulong fibo = 1;
}
void main() {
writeln(fibo!(50));
}

D言語だと割とすっきり書けてる気がするんですがどうでしょう。(すっきりも何も大したことやってないけど)

で、D言語にはstatic if文というコンパイル時にコードを条件分岐出来る構文があったりします。(CやC++だとプリプロセッサのif文のような)
import std.stdio;
template Fibonacci(int n) {
static if (n == 0)
const Fibonacci = 0;
else static if(n == 1)
const Fibonacci = 1;
else static if(n == -1)
const Fibonacci = 1;
else static if(n > 1)
const Fibonacci = Fibonacci!(n - 1) + Fibonacci!(n - 2);
else
const Fibonacci = Fibonacci!(n + 2) - Fibonacci!(n + 1);
}
void main() {
Fibonacci!(0).writeln;
Fibonacci!(-1).writeln;
Fibonacci!(-2).writeln;
Fibonacci!(-3).writeln;
Fibonacci!(-9).writeln;
Fibonacci!(-10).writeln;
}

テンプレートを一つにまとめたり

static if文を使うとテンプレートFizzBuzzとかも簡単に書けますね
import std.stdio, std.conv;
template FizzBuzz(ulong n) {
static if(n % 15 == 0)
const FizzBuzz = "FizzBuzz";
else static if(n % 3 == 0)
const FizzBuzz = "Fizz";
else static if(n % 5 == 0)
const FizzBuzz = "Buzz";
else
const FizzBuzz = n.to!string();
}
void main() {
FizzBuzz!(1).writeln;
FizzBuzz!(3).writeln;
FizzBuzz!(5).writeln;
FizzBuzz!(15).writeln;
FizzBuzz!(98).writeln;
}


D言語は割とコンパイル時に色々出来る代わりに、昔と比べるとコンパイルが遅くなったという話もたまに見かけるような……

0 件のコメント:

コメントを投稿