我刚接触 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 块:
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();
而且我也不知道该怎么做。