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