Использует для продолжения Scala - PullRequest
17 голосов
/ 26 октября 2010

Как люди используют продолжения в большем и меньшем масштабе в Scala?

Есть ли какие-либо части стандартной библиотеки Scala, написанные на CPS?

Существуют ли какие-либо серьезные потери производительности при использовании продолжений

Ответы [ 2 ]

14 голосов
/ 26 октября 2010

Я использую это для преобразования асинхронных функций вида 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

7 голосов
/ 26 октября 2010

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()
    }
  }
}
...