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