2

目前我使用 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?

4

1 回答 1

2

我相信您正在寻找的一般概念是延续。这本身就是一个相当大而复杂的话题——它们曾经被谈论得更多,但在很大程度上被更易于使用的异步库所取代。但是scala-continuations 库仍然存在,并且在网上讨论了很多地方——例如,这篇文章,或者这篇文章。

于 2016-09-08T12:11:24.430 回答