2010-10-26 14 views
17

In che modo le persone usano le continuazioni su scala sempre più piccola in Scala?Usi per continuazioni di Scala

Sono presenti parti della libreria standard di Scala scritte in CPS?

Ci sono delle penalità di prestazioni importanti nell'utilizzo di continuazioni?

+5

una NIT: CPS (stile continuazione-passing) è qualcosa che è possibile in qualsiasi linguaggio che ha o può simulare funzioni di ordine superiore. Ad esempio, quando si passa un oggetto callback a un metodo in Java, questo è in realtà un esempio di CPS. Il plug-in * delimited continuations * di Scala fornisce un modo per scrivere strutture di controllo che somigliano sintatticamente allo "stile diretto" ma che sono trasformate in CPS dietro le quinte. –

risposta

14

Sto usando questo per trasformare le funzioni asincrone della forma def func(...)(followup: Result => Unit): Unit in modo che invece di scrivere

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

è possibile scrivere

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

o

car(bar(foo(args))) 

(nota: le funzioni non sono limitate a un argomento o solo l'uso di risultati precedenti come argomenti)

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

continuazioni
+0

Questo è un buon esempio, probabilmente avrebbe più valore didattico se il nesting fosse più profondo però :) –

7

Scala-ARM (Automatic-Resource-Management) utilizza delimitato

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

Scusa, ma quali sono i vantaggi di scriverlo in questo modo?

Quindi la continuazione è 'k', che rappresenta una stampa seguita da un'istruzione di colore? In questo caso, non vedo i vantaggi dell'utilizzo di CPS. –

Problemi correlati