Как люди используют продолжения в большем и меньшем масштабе в Scala?
Есть ли какие-либо части стандартной библиотеки Scala, написанные на CPS?
Существуют ли какие-либо серьезные потери производительности при использовании продолжений
Я использую это для преобразования асинхронных функций вида def func(...)(followup: Result => Unit): Unit, чтобы вместо записи
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() } } }