2010-10-26 6 views
17

Comment les gens utilisent-ils les continuations à une échelle de plus en plus grande dans Scala?Utilisations pour les suites Scala

Des parties de la bibliothèque standard Scala sont-elles écrites en CPS?

Y a-t-il des pénalités de performance majeures dans l'utilisation des continuations?

+5

un nit: CPS (style passage de continuation) est quelque chose qui est possible dans une langue qui a ou peut simuler fonctions d'ordre supérieur. Par exemple, lorsque vous passez un objet de rappel à une méthode en Java, c'est en fait un exemple de CPS. Le plugin * des prolongations * de Scala permet d'écrire des structures de contrôle qui ressemblent de manière syntaxique au "style direct" mais qui sont transformées en CPS dans les coulisses. –

Répondre

14

J'utilise cela pour transformer les fonctions asynchrones de la forme def func(...)(followup: Result => Unit): Unit de sorte qu'au lieu d'écrire

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

vous pouvez écrire

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

ou

car(bar(foo(args))) 

(Note: les fonctions ne sont pas limitées à un argument ou simplement à l'utilisation des résultats précédents en tant qu'arguments)

Voir http://www.tikalk.com/java/blog/asynchronous-functions-actors-and-cps

+0

Ceci est un très bon exemple, il aurait probablement plus de valeur didactique si l'imbrication était plus profonde cependant :) –

7

Scala-ARM (-gestion automatique-ressources) utilise délimité continuations

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() 
    } 
    } 
} 
+1

Excusez-moi, mais quels sont les avantages de l'écrire comme ça? Donc, la suite est 'k', ce qui représente un println suivi d'une instruction flush? Je ne vois pas les avantages de l'utilisation de CPS dans ce cas. –