I thought I'd take the opportunity to point this out:

The one-line FFT in D is pretty inefficient because it allocates memory.

If std.range supported recursion (i.e. by providing a different implementation for ranges that can be implemented without creating new times, i.e. Stride of Stride == Stride), then it would make the library a lot more usable and less bloated.


My one-line FFT illustrates it perfectly:


import std.algorithm;
import std.math;
import std.range;
typeof(R.init.stride(0)) dft(R)(R v)
{
        return v.length > 1 ?
(p => chain(map!(q => q[0] + q[1])(p), map!(q => q[0] - q[1])(p)))
          (zip(dft(v.stride(2)),
               map!(p => p[1] * expi(p[0] * -2 * PI / v.length))
               (zip(iota(v.length / 2), dft(v.drop(1).stride(2)))))) : v;
}
void main() { dft([1.0, 2, 3]); }


Side note: the error messages are also hard to read.

Reply via email to