gpt4 book ai didi

javascript - Sweet.js 的惰性求值宏

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:45:26 27 4
gpt4 key购买 nike

我刚接触 JavaScript,发现这种语言不直接支持惰性求值。代码本身变成了这样的样板:

function lazy(f) {
var v = undefined;
return function() {
if (v == undefined)
v = f();
return v;
}
}

// 10 times larger than actual operation
var foo = lazy(function() {
return 3 + 3;
});

但我找到了 Sweet.js 并相信它可以使代码像这样简单:

var foo = lazy (3 + 3);

var goo = lazy {
var a = 3 + 3;
return a;
};

所以我测试了Edit Sweet.js :

function lazy_f(f) {
var v = undefined;
return function() {
if (v == undefined)
v = f();
return v;
}
}

macro lazy {
rules { $expr } => {
lazy_f(function() { return $expr; })
}
}

var foo = lazy (3 + 3);

它使用单个 expr。但是在某些情况下,lazy 会像这样接受一个 expr block :

var goo = lazy {
var a = 3 + 3;
return a;
};

所以我把上面的代码整理成这样:

function lazy_f(f) {
var v = undefined;
return function() {
if (v == undefined)
v = f();
return v;
}
}

macro lazy {
rule { $($expr) (;) ... } => { //
lazy_f(function() $expr ...); //
} //
rules { $expr } => {
lazy_f(function() { return $expr; })
}
}

var foo = lazy (3 + 3);

var goo = lazy {
var a = 3 + 3;
return a;
};

而且由于某种原因它不起作用。我相信第一个模式 $($expr) (;) ... 不应该与 (3 + 3) 匹配,但显然它正在做。

我为此工作了一个小时,最后放弃了。如何让这两种模式同时发挥作用?

如果做不到,我想对单个expr采取另一种方式:

lar foo = 3 + 3;
var foo_content = foo();

我也不知道该怎么做。

最佳答案

因为你想用大括号来使用它,你需要在宏中包含括号,比如@timdisney said .

但是,要惰性地评估像 var a = lazy this.x * this.y 这样的表达式,您需要将表达式正确地绑定(bind)到 this 的当前值.

完整代码

function lazyEvaluate(thisObject, functionToEvaluate) {
var result, hasResult = false;

return function () {
if (hasResult) {
return result;
} else {
hasResult = true;

return result = functionToEvaluate.call(thisObject);
};
};
}

let lazy = macro {
rule {
{
$statements ...
}
} => {
lazyEvaluate(this, function () {
$statements ...
})
}
rule { $expression:expr } => {
lazyEvaluate(this, function () {
return $expression;
})
}
}

这应该适用于任何有效的表达式。

例子

var a = 5, b = 2, c = lazy a * b, d = lazy {
console.log(c());

return c() * a;
};

a = 10;

console.log(c()); // 20

a = 5;

console.log(d()); // 100

关于javascript - Sweet.js 的惰性求值宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29072793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com