【问题标题】:Library/Compiler to use continuations in JavaScript在 JavaScript 中使用延续的库/编译器
【发布时间】: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))?

标签: javascript continuations


【解决方案1】:

我认为您可能正在寻找的是 babel 支持的生成器: https://babeljs.io/learn-es2015/#ecmascript-2015-features-generators

【讨论】:

  • 嗨,我认为生成器不允许暂停/停止计算或与另一个计算交换。例如,使用延续,您可以用“空”延续(即计算)替换当前计算,最终停止程序的执行。
猜你喜欢
  • 2014-11-13
  • 2020-04-06
  • 2012-01-17
  • 1970-01-01
  • 2011-10-22
  • 2020-05-01
  • 2019-05-31
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多