jsで遅延評価

課題をやっていたはずなのになぜかこんなものができてしまった。ふしぎ。

function Promise(x) {
    this.cache=null;
    this.force=function() {
        if(this.cache==null)
          this.cache=x();
        return this.cache;
    }
}

function tarai(x,y,z) {
    if(x<=y) return y;
    return tarai(tarai(x-1,y,z),
                 tarai(y-1,z,x),
                 tarai(z-1,x,y));
}

function tarai_d(x,y,z) {
    return tarai_d_impl(new Promise(function(){return x;}),
                        new Promise(function(){return y;}),
                        new Promise(function(){return z;})).force();
}

function tarai_d_impl(x,y,z) {
    var tarai=tarai_d_impl;
    if(x.force() <= y.force())
      return y;
    else
      return tarai(tarai(new Promise(function(){return x.force()-1;}),y,z),
                   tarai(new Promise(function(){return y.force()-1;}),z,x),
                   new Promise(function(){return tarai(new Promise(function(){return z.force()-1;}),x,y);}));
}