2010-10-26 40 views
17

Làm cách nào để mọi người sử dụng tính năng tiếp tục trên quy mô lớn hơn và nhỏ hơn trong Scala?Sử dụng để tiếp tục Scala

Có bất kỳ phần nào của thư viện chuẩn Scala được viết bằng CPS không?

Có bất kỳ hình phạt hiệu suất lớn nào trong việc sử dụng các lần tiếp tục không?

+5

một nit: CPS (tiếp-qua phong cách) là cái gì đó là có thể trong bất kỳ ngôn ngữ mà có hoặc có thể mô phỏng các hàm bậc cao hơn. Ví dụ, khi bạn chuyển một đối tượng gọi lại đến một phương thức trong Java, đó thực sự là một ví dụ về CPS. Scala * liên tục giới hạn * plugin cung cấp một cách để viết các cấu trúc điều khiển mà trông giống như cú pháp "phong cách trực tiếp" nhưng được chuyển thành CPS đằng sau hậu trường. –

Trả lời

14

Tôi đang sử dụng này để bật chức năng không đồng bộ của các hình thức def func(...)(followup: Result => Unit): Unit để thay vì viết

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

bạn có thể viết

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

hoặc

car(bar(foo(args))) 

(lưu ý: các hàm không bị giới hạn trong một đối số hoặc chỉ sử dụng các kết quả trước đó làm đối số)

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

continuations
+0

Đây là một ví dụ khá hay, nó có lẽ sẽ có giá trị giáo khoa nhiều hơn nếu lồng nhau càng sâu hơn :) –

7

Scala-ARM (Automatic-Resource-Management) sử dụng phân

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

Xin lỗi, nhưng lợi ích của việc viết nó như thế nào?

Vì vậy, việc tiếp tục là 'k', đại diện cho một println theo sau là một tuyên bố tuôn ra? Tôi không thấy lợi ích của việc sử dụng CPS trong trường hợp này. –

Các vấn đề liên quan