kubo39's blog

ただの雑記です。

フィボナッチ

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 $