JavaScript で遅延評価
ぶっちゃけ
僕は遅延評価のことたぶんあんまり理解してないと思います。
でも、とりあえずこんなの作ってみた
function l(a) { return typeof a == 'function' ? a() : a } // lazy の l
こうやって使う
function add(i, j) { return l(i) + l(j) } var count = 0; alert(add(1, 1)); // 2 alert(add(1, function(){ return 1 })); // 2 alert(add(1, function(){ return count++ })); // 1 alert(add(1, function(){ return count++ })); // 2 alert(add(1, function(){ return count++ })); // 3
これって遅延評価なのかな
でも、関数作るときに意識しないといけないから違うのかな。
もう一個、こんなの作ってみた
function l(v) { return { valueOf: v } }
こうやって使う
function add(i, j) { return i + j } var count = 0; alert(add(1, 1)); // 2 alert(add(1, l(function(){ return 1 }))); // 2 alert(add(1, l(function(){ return count++ }))); // 1 alert(add(1, l(function(){ return count++ }))); // 2 alert(add(1, l(function(){ return count++ }))); // 3
これって遅延評価なのかな
こっちは、関数作るときに意識しないでいいけど。イコールのときに評価してくれない
追記:こんなのも思いついた
Function.prototype.lazy = function() { return { valueOf: this } };
ただ関数プロトタイプにしただけだけど
var random = Math.random.lazy() function add(i, j) { return i + j } alert(add(random, 1)); alert(add(random, 2)); alert(add(random, 3)); alert(add(random, 4)); alert(add(random, 5));
うわあああああああああああああああああああああああ!
これは予想以上に感動したあああああああ!
やべ
雑誌の原稿書かないと・・・・
JavaScript でフィボナッチ数列を高速に求める
低速版
function fib(i) { if(i == 0 || i == 1) return i; return fib(i-1) + fib(i-2); }
高速版
function fib(i) { return (function(i) { if(i == 0) return [0, 1]; return (function(a){ return [a[1], a[1] + a[0]] })(arguments.callee(i-1)); })(i)[0] }