好吧,我只是准备放弃这个。
我想保存延续状态(使用shift完成)。 但是,需要注意的是,重置后的代码不应该执行。考虑工作线程正在执行的继续,不应再处理。延续保存在可以恢复的全局延续列表中,其后的所有其他内容都被忽略,不应该执行。
工作线程必须存活(不能中止或破坏,需要旋转新线程)。
reset {
shift {
(cont:Unit=>Unit) =>
println(1)
suspend() // how would I implement something like this?
cont()
}
println(3)
}
println(2)
应该产生
1
恢复继续应该产生
3
2
目前这似乎根本不可能,因为延续仅限于重置的范围。但我想我会给StackOverflow一个裂缝。
编辑:基本上......(也许我应该先把它放进去)我想调用一个方法,暂停执行直到它准备好给我一个结果,我想在一个事件循环中实现这个,而不是线程同步。
答案 0 :(得分:1)
我不确定,这是否适用于您的情况,但这里是如何混合多次重置的示例:
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
如果您不想在调用f之后暂停所有内容,直到重置结束,该怎么办:
reset {
println(-1)
shift { k: Proc =>
reset{f()}()
k()
}
println(4)
}
println("...")
打印:
-1
0
1
2
3
4
...