【发布时间】:2015-03-16 08:54:12
【问题描述】:
我刚接触 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();
我也不知道该怎么做。
【问题讨论】:
标签: javascript lazy-evaluation sweet.js