Javascript 个发电机 Scala.js

Javascript generators in Scala.js

目前我使用 Transcrypt 从 Python 代码生成 Javascript 代码。通过这种方式,我可以在 Python 中实现生成器,例如:

def color():
    colors = ["red", "blue", "yellow"]
    i = -1
    while True:
        i += 1
        if i >= colors.length:
            i = 0
        reset = yield colors[i]
        if reset:
            i = -1

gen = color()
console.log(next(gen)) # red
console.log(gen.js_next(True).value) # red
console.log(next(gen)) # blue
console.log(next(gen)) # yellow
console.log(next(gen)) # red

将被编译为 Javascript,如:

var color = function* () {
    var colors = list (['red', 'blue', 'yellow']);
    var i = -(1);
    while (true) {
        i++;
        if (i >= colors.length) {
            var i = 0;
        }
        var reset = yield colors [i];
        if (reset) {
            var i = -(1);
        }
    }
};
var gen = color ();
console.log (py_next (gen));
console.log (gen.next (true).value);
console.log (py_next (gen));
console.log (py_next (gen));
console.log (py_next (gen));

但是因为我也有 Scala 知识(以及我想在浏览器中实现的 Scala 应用程序),所以我希望 Scala.js。但据我所知,这种生成器构造在 Scala 中是不可能的,相应的 yield 关键字以不同的方式使用。

生成器语法在 Scala.js 中是否可行,或者如果我想要这个,我是否被迫使用 Python 和 Transcrypt?

我相信您正在寻找的一般概念是 Continuations。这本身就是一个相当庞大和复杂的话题——它们过去被讨论得更多,但在很大程度上已被更易于使用的异步库所取代。但是 scala-continuations library is still around, and discussed various places online -- for example, this article, or this one.