【问题标题】:Does it matter where a shift stands in a reset block?重置块中的移位是否重要?
【发布时间】:2011-09-05 01:24:00
【问题描述】:
假设,有一个reset 块和一个shift:
val r = 重置 {
// 做某事。 1
转移 {...}
// 做某事。 2
// 做某事。 3
}
我将shift 放在“do smth.2”或“do smth.3”之后而不改变结果r 是否正确? shift 在 reset 块中的位置无关紧要是否正确?
【问题讨论】:
标签:
scala
continuations
delimited-continuations
【解决方案1】:
这在很大程度上取决于您在shift 中所做的事情。如果您只是像这样调用提供的函数:shift((k: Unit => Unit) => k(Unit)) 那么,在您的特定示例中,shift 的位置并不重要。
Shift 函数只捕获其他函数中的代码(在我的示例中,此函数称为k)。换句话说,这段代码:
val r = reset {
// do smth. 1
shift((k: Unit => Unit) => k(Unit))
// do smth. 2
// do smth. 3
}
将由编译器以这样的方式重写(此代码仅展示一般概念,并不应该显示编译器插件实际生成的内容):
val k = (Unit => Unit) => {
// do smth. 2
// do smth. 3
}
val r = {
// do smth. 1
k(Unit)
}
但是,如果您在 shift 内部有一些逻辑,例如有条件的 k 执行,那么这个 shift 的位置真的很重要。
希望这会有所帮助(我希望我正确理解了您的问题)
【解决方案2】:
除了已经给出的答案之外,您可以在shift 中移动的地方是在班次之前有代码还是将其包含在您传递给shift 的函数中:
reset {
foo(); bar();
shift { k => stuff }
baz()
}
与
相同
reset {
foo();
shift { k => bar(); stuff }
baz()
}