【发布时间】:2017-07-15 12:26:52
【问题描述】:
我正在寻找一个 JavaScript 库/编译器,它允许开发人员使用像在 Scheme(或 Rhino)中找到的延续。例如,这个库应该允许我们做一些类似的事情:
var kont;
function add(x,y) {
return x +
(function() {kont = new Continuation(); return y;})();
}
var executed = false; //avoiding infinite recursion
show(add(5,1)); //show 6
if (!executed) {
executed = true;
kont(20); // show 25 because the "y" binding is changed
}
var result = cont(20);
此代码背后的要点是:a) 捕获和 b) 恢复 JavaScript 脚本的控制流(或执行)。为了恢复执行,我想“捕获”应该是像 'kont = new Continuation()' 这样的一流值
我搜索了库,但我只找到了 jwacs (http://chumsley.org/jwacs/),但是这个项目要停止了。可悲的是,Babel (https://babeljs.io/) 不支持它:(。
有什么帮助吗?
【问题讨论】:
-
为了让这个存在于各种各样的 JavaScript 实现中,底层实现必须能够生成一个作为工件的延续。您不能使用现有标准 javascript 功能的库来伪造这一点。那么你为什么会期望它存在呢?
-
恕我直言,如果您使用转译器(源到源编译器),您可以做到。因此,您可能会找到一个使用转译器来引入延续的库。
-
“转译器”必须使用目标语言原语来实现它可能拥有的任何概念。如果目标语言无法捕获执行状态,请解释它如何实现延续?
-
将代码转换为连续传递样式(CPS)并捕获“k”值(函数(... k))?