// // encoded in Unicode( UTF-8 ) // if you cannot see comments correctly, please // configure your web browser etc's option. // //--------------------------------------- // fが'pureな'、つまり、引数が同じならば // 必ず答えも同じになるような関数なら、 // 一回目の計算の値を保存しておいて、 // 二回目以降はその値を返すようにする。 // もしその関数内の計算が非常に複雑な // ものだった場合、効率化が期待出来たりする。 //--------------------------------------- function make_cached_function( f ) { if( !f.pure ) return f; var cache; var prevarg; return function( x ) { if( x != prevarg ) { prevarg = x; cache = f( x ); } return cache; } } //--------------------------------------- // pureでない関数の例 //--------------------------------------- function random_under( x ) { return Math.random() * x; } //--------------------------------------- // 関数オブジェクトに、pureという // プロパティを「実行時に」追加してしまうことができる //--------------------------------------- function half_of( x ) { return x / 2; } half_of.pure = true; //--------------------------------------- var f = make_cached_function(random_under); var g = make_cached_function(half_of); print( f(100) ); print( f(100) ); print( f(100) ); print( f(100) ); print( g(100) ); print( g(100) ); print( g(100) ); print( g(100) );