最初に書いたのがこれ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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文のような)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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とかも簡単に書けますね
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 件のコメント:
コメントを投稿