Scala Continuations:Suspend without wait/sleep()
好吧,我准备放弃了 我想保存延续的状态(使用shift完成)。 但是,需要注意的是,不应执行重置后的代码。考虑继续由工作者线程执行,并且不应该被处理。该延续保存在可恢复的全局延续列表中,其他所有延续都将被忽略且不应执行 工作线程必须存活(不能中止,也不能在需要旋转新线程的情况下销毁) 应该让步Scala Continuations:Suspend without wait/sleep(),scala,continuations,Scala,Continuations,好吧,我准备放弃了 我想保存延续的状态(使用shift完成)。 但是,需要注意的是,不应执行重置后的代码。考虑继续由工作者线程执行,并且不应该被处理。该延续保存在可恢复的全局延续列表中,其他所有延续都将被忽略且不应执行 工作线程必须存活(不能中止,也不能在需要旋转新线程的情况下销毁) 应该让步 1 恢复延续应该会产生效果 3 2 目前,这似乎根本不可能,因为继续操作仅限于重置的范围。但我想我会尝试一下 编辑:基本上。。。(也许我应该把它放在前面)我想调用一个方法,并暂停执行,直到它准备好
1
恢复延续应该会产生效果
3
2
目前,这似乎根本不可能,因为继续操作仅限于重置的范围。但我想我会尝试一下
编辑:基本上。。。(也许我应该把它放在前面)我想调用一个方法,并暂停执行,直到它准备好给我一个结果,我想通过一个事件循环来实现这一点,而不是线程同步。我不确定这是否适用于您的情况,但下面是如何混合多重重置的示例:
type Proc = Unit => Unit
val resume = reset {
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1()
}
println(3)
}
}
println(2)
}
// 1
resume()
// 3
// 2
更新:
下面是如何将其与方法结合使用:
def f(): Unit @cpsParam[Unit, () => Unit] = {
println(0)
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1()
}
println(2)
}
}
println(3)
}
val continue = reset {
println(-1)
f()
println(4)
}
println("...")
continue()
印刷品:
-1
0
1
...
2
3
4
-1
0
1
2
3
4
...
如果您不想在调用f之后暂停所有操作,直到重置结束,那么可以这样做:
reset {
println(-1)
shift { k: Proc =>
reset{f()}()
k()
}
println(4)
}
println("...")
印刷品:
-1
0
1
...
2
3
4
-1
0
1
2
3
4
...
嗯,我认为这是不可能的,但扩大重置范围有什么问题?您知道cpsParam注释吗,它允许在方法内部使用shift,而该方法根本没有重置,所以当对该方法的调用出现在某个重置中时,它将以预期的方式工作?您也可以使用嵌套重置。我可以扩展重置范围,但重置中编写的代码将由第三方完成,因此我无法控制代码,放置@cpsParam可能不可行/不方便。我觉得这将我推向了正确的方向。但是,是否绝对有必要将@cpsParam放在调用堆栈中的所有方法上?会有更方便的方法吗?只有那些包含裸移位或其他方法的方法,注释如下。它是静态类型化所必需的——否则编译器无法知道您的移位控制流将以哪种类型结束,并且是cps转换所必需的——否则编译器不会以连续传递样式转换方法。但您通常可以完全避免编写返回类型,并且类型推断将通过正确的注释得到它。我在这方面没有取得太大的进展,事实上,对于我正在尝试的内容,似乎没有一个现有的解决方案,所以我将其搁置。无论如何,谢谢你的回答。