人们在Scala中如何在较大和较小的规模上使用continuations?
Scala标准库中是否有任何部分是用CPS编写的?
在使用continuations时是否存在任何主要性能惩罚?
人们在Scala中如何在较大和较小的规模上使用continuations?
Scala标准库中是否有任何部分是用CPS编写的?
在使用continuations时是否存在任何主要性能惩罚?
我将使用以下内容来转换形如 def func(...)(followup: Result => Unit): Unit
的异步函数,以便不必编写:
foo(args){result1 =>
bar(result1){result2 =>
car(result2) {result3 =>
//etc.
}
}
}
你可以编写
val result1 = foo(args)
val result2 = bar(result1)
val result3 = car(result2)
或者car(bar(foo(args)))
(注意:这些函数不仅限于一个参数,也不仅限于将先前的结果用作参数)
参见http://www.tikalk.com/java/blog/asynchronous-functions-actors-and-cps
Scala-ARM(自动资源管理)使用了分界限制续体技术。
import java.io._
import util.continuations._
import resource._
def each_line_from(r : BufferedReader) : String @suspendable =
shift { k =>
var line = r.readLine
while(line != null) {
k(line)
line = r.readLine
}
}
reset {
val server = managed(new ServerSocket(8007)) !
while(true) {
// This reset is not needed, however the below denotes a "flow" of execution that can be deferred.
// One can envision an asynchronous execuction model that would support the exact same semantics as below.
reset {
val connection = managed(server.accept) !
val output = managed(connection.getOutputStream) !
val input = managed(connection.getInputStream) !
val writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(output)))
val reader = new BufferedReader(new InputStreamReader(input))
writer.println(each_line_from(reader))
writer.flush()
}
}
}
k
,它代表了一个 println 后跟着一个 flush 语句?我没有看到在这种情况下使用 CPS 的好处。 - Mohamed Bana