2010-10-26 17 views
17

स्कैला में बड़े और छोटे पैमाने पर निरंतरता का उपयोग करने वाले लोग कैसे उपयोग कर रहे हैं?स्कैला निरंतरता के लिए उपयोग

सीपीएस में लिखे गए स्कैला मानक पुस्तकालय के कोई भी हिस्से हैं?

क्या निरंतरता का उपयोग करने में कोई प्रमुख प्रदर्शन जुर्माना है?

+5

एक निट: सीपीएस (निरंतरता-गुजर शैली) कुछ है कि है या अनुकरण कर सकते हैं कि किसी भी भाषा में संभव है उच्च आदेश कार्यों। उदाहरण के लिए, जब आप जावा में किसी विधि को कॉलबैक ऑब्जेक्ट पास करते हैं, तो यह वास्तव में सीपीएस का एक उदाहरण है। स्कैला की * सीमित निरंतरता * प्लगइन नियंत्रण संरचनाओं को लिखने का एक तरीका प्रदान करता है जो वाक्य रचनात्मक रूप से "प्रत्यक्ष शैली" की तरह दिखते हैं लेकिन जो दृश्यों के पीछे सीपीएस में परिवर्तित हो जाते हैं। –

उत्तर

14

मैं इस का उपयोग कर रहा प्रपत्र 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

+0

यह एक बहुत अच्छा उदाहरण है, अगर घोंसले गहरे थे तो शायद यह अधिक व्यावहारिक मूल्य होगा :) –

7

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

क्षमा करें, लेकिन इसे लिखने के क्या फायदे हैं?

तो निरंतरता 'k' है, जो एक फ्लश स्टेटमेंट के बाद एक println का प्रतिनिधित्व करता है? मुझे इस मामले में सीपीएस का उपयोग करने के लाभ नहीं दिख रहे हैं। –

संबंधित मुद्दे