読者です 読者をやめる 読者になる 読者になる

遅延評価

プログラム

とある事情で遅延評価を勉強中

これって遅延評価?
Haskell的には関数宣言自体がpromiseになってて,常時遅延評価され,変数の読み込み自体がforceになってる気がするんだけど...

これってどちらかというとscheme的?(これもほんとはよく分かってない)

一応,このスクリプトを走らせると,先に関数gの中身が表示されて,その後で関数fの中身が表示されます.
つまり,引数になりうるときに初めて評価されると.

本当は関数合成みたいな書き方ができると嬉しいです.
あと,なんだか夜中なので複数引数渡しを拒否してます(微妙に・・・)

f(g(h(3),5))みたいなのができるようになるといいと思うのでできれば最初にライブラリを読んで,Functionクラス自体を書き換えてしまえばいいような気がします.

var Lazy = function(){};
Lazy.prototype = {
    func : null,
    args : null,
    promise : function(f){
	this.func = f;
    },
    bind : function(args){
	this.args = args;
    },
    force : function(){
        alert(this.func);
	if(this.args.length){
	    for(var i = 0; i < this.args.length; i++){
		if(this.args[i].promise != null){
		    this.args[i] = this.args[i].force();
		}
	    }
	}else{
	    if(this.args.promise != null){
		this.args = this.args.force();
	    }
	}
	return this.func(this.args);
    }
}
f = new Lazy();
f.promise(function(x){return x+1});
f.bind(3);
g = new Lazy();
g.promise(function(x){return x*2});
g.bind(f);
alert(g.force());

追記:
今,確認したら,g.bind(f.bind(3))見たいな事をすると,thisでちょっと怒られているので,朝になったら直します.

追記2:
やっぱり、force内(promiseで渡されたfunction内)で全引数を評価しているのは間違ってる気がする。本当は、関数に渡すときには全部、識別子で渡して、FunctionStatement内では変数を全部f()形式にして、数式を計算するようにしたい。関数の拡張かなぁ・・・?

g.bind(f, 3, 6);

g.promise(function(f, n){
  return f() + n();
}

みたいな。

ココロはあってるのか?

追記3:
キャッシュの仕組みがないので、それを加えたいと思います。ただ、同じ変数が異なる数値にbindされたときにはキャッシュはクリア(または、配列にプッシュ?)しないといけないです。