ぶっちゃけ
僕は遅延評価のことたぶんあんまり理解してないと思います。
でも、とりあえずこんなの作ってみた
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));
うわあああああああああああああああああああああああ!
これは予想以上に感動したあああああああ!
やべ
雑誌の原稿書かないと・・・・