次のように定義された関数を考えてみましょう。
f(n, x) = F(n, x, f(n-1, x))
f(0, x) = g(x)
私のプログラムでは、 の値はn
コンパイル時に常にわかっています。プログラムを最適化し、この関数でのループや再帰呼び出しを回避したいと考えています。コンパイラが式を最適化できるように、式全体f(n, x)
をコンパイル時に生成する必要があります。
mixin
直接的な解決策は、この式と useステートメントを含む文字列を「手動で」生成することです。私はこの方法が好きではありません。
コンパイラは、既知の深さで再帰を展開できる/想定されていますか?
つまり、次の関数は私が望む方法で最適化されます:
double f(uint n)(double x)
{
static if(n == 0)
return g(x);
else
return F(n, x, f!(n-1)(x));
}