import std.stdio : writeln; import std.conv : to; class Fib(T) if (__traits(isIntegral, T)) { T opIndex(T n) const pure nothrow @trusted @nogc in { assert(n > 0); } body { T y; { T x = 1; foreach (_; 0..n) (((x = n = x) += y) ? y : y) = n; } return y; } } version(unittest) {} else void main() { (new Fib!int)[10].writeln; } unittest { template makeAssertionTest(T, E) if (__traits(isIntegral, T) && __traits(isIntegral, E)) { string makeAssertionTest(in T n, in E ans) const inout pure nothrow @trusted @property in { assert(n > 0); } body { return "assert((new Fib!int)[" ~ n.to!string ~ "] == " ~ ans.to!string ~ ");"; } } mixin( makeAssertionTest!(int, int)(9, 34) ); mixin( makeAssertionTest!(int, int)(10, 55) ); }
追記:
実行結果など貼り忘れてた。
( ՞ਊ ՞) :~/dev $ dmd --help | head -2 DMD64 D Compiler v2.066.1 Copyright (c) 1999-2014 by Digital Mars written by Walter Bright ( ՞ਊ ՞) :~/dev $ rdmd fib.d 55 ( ՞ਊ ՞) :~/dev $ dmd fib.d -unittest -main ( ՞ਊ ՞) :~/dev $