追加 非template版
せっかくだからテンプレートを使わずに書いてみる。
関数内関数は関数外に出たら無効になるという嫌すぎな仕様があるので泣く泣く自力で使う変数を退避。
あとD言語はfunctionとdelegateを統合して欲しい。使い分けがメンドくさいから
int delegate(int) fix(int function(int delegate(int),int) f){ /* こう書ければ幸せなのに...... int call(int n){ return f(&call,n); } return &call; */ alias typeof(f) f_t; struct call_t{ f_t f; int call(int n){ return f(&call,n); } } call_t*c=new call_t; c.f=f; return &c.call; } int delegate(int) memo(int function(int delegate(int),int) f){ alias typeof(f) f_t; struct call_t{ f_t f; int memo[int]; int call(int n){ int*p=n in memo; return !p?memo[n]=f(&call,n):*p; } } call_t*c=new call_t; c.f=f; return &c.call; } int fib_maker(int delegate(int)f,int n){ if(n <= 1) return 1; else return f(n-1) + f(n-2); } void main(){ int delegate(int)fib; fib = fix(&fib_maker); for( int i=0 ; i!=10 ; ++i )printf("%d\n",fib(i)); printf("\n"); fib = memo(&fib_maker); for( int i=0 ; i!=10 ; ++i )printf("%d\n",fib(i)); printf("\n"); }