無名再帰と言えば不動点コンビネータですね。 D言語だと、定義のとおりに不動点コンビネータを書けます。
R delegate(Args) fix(R, Args...)(R delegate(R delegate(Args), Args) f)
{
return (Args args) => f(fix(f), args);
}
ラムダ構文があるので、少し楽に書けます。 上で定義した不動点コンビネータを使うと、以下のように無名再帰ができます。
R delegate(Args) fix(R, Args...)(R delegate(R delegate(Args), Args) f)
{
return (Args args) => f(fix(f), args);
}
void main()
{
import std.stdio;
fix((int delegate(int) rec, int num) => num != 0 ? num * rec(num - 1) : 1)(5).writeln();
}
残寝ながら、recとnumの引数の型は省略できません。そこまで推論してくれないみたいですね。
担当:美馬(型を省略したい・・・)