Pergunta

Como as pessoas que usam continuações em uma escala maior e menor em Scala?

Alguma parte da biblioteca padrão do Scala está escrita no CPS?

Existem penalidades importantes de desempenho no uso de continuações?

Foi útil?

Solução

Estou usando isso para transformar funções assíncronas do formulário def func(...)(followup: Result => Unit): Unit Então, em vez de escrever

foo(args){result1 => 
  bar(result1){result2 => 
     car(result2) {result3 =>
       //etc.
     }
  }
}

você pode escrever

val result1 = foo(args)
val result2 = bar(result1)
val result3 = car(result2)

ou

car(bar(foo(args)))

(Nota: as funções não se limitam a um argumento ou apenas o uso de resultados anteriores como argumentos)

Ver http://www.tikalk.com/java/blog/asynchronsofunctions-actors-and-cps

Outras dicas

Braço scala (Gerenciamento de resistência automática) usa continuações delimitadas

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()
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top