क्या क्लोजर में निरंतरता / कोरटाइन / आदि है?


20

मैंने पायथन के साथ प्रोग्रामिंग शुरू की, और मैं कोरटाइन्स और क्लोजर जैसी अवधारणाओं से वास्तव में भ्रमित था।

अब मुझे लगता है कि मैं उन्हें कुछ सतही स्तर पर जानता हूं, लेकिन मैंने कभी भी उस "ज्ञान" को महसूस नहीं किया है, इसलिए मैं क्लोजर सीखने का चयन करता हूं। मैंने स्टुअर्ट हल्लोवे द्वारा पुस्तक खरीदी और यह अच्छा है, लेकिन जब मैंने सूचकांक को देखा तो इसमें कोरटाइन या निरंतरता जैसे शब्द नहीं थे। मैंने उन्हें देखा, लेकिन वहां भी कुछ नहीं है।

तो, मेरा सवाल है:

क्या क्लोजर में स्टैक ओवरफ्लो के बिना पिंग-पोंगिंग जैसे कार्य करने के लिए निरंतरता या कॉरटाइन्स हैं?

पायथन उदाहरण (हालांकि मानक पायथन इस सममित कोरूटीन के पूर्ण रूप से चित्रित संस्करण का समर्थन नहीं करता है):

def ping():
  while 1:
   print "ping"
   function to switching to pong

def pong():
  while 1:
   function to switching to ping
   print "pong"

जवाबों:


20

क्लोजर में कॉल / cc नहीं है, लेकिन आप वैसे भी अनडिल्टेड निरंतरता नहीं चाहते हैं

हम call/ccमूल भाषा सुविधा के रूप में तर्क देते हैं, विशिष्ट नियंत्रण ऑपरेशन के रूप में सभी पुस्तकालयों में मूल रूप से अन्य को फिर से लागू करने के लिए। आदिम call/ccएक बुरा अमूर्त है - नीचे दिखाए गए 'बुरे' के विभिन्न अर्थों में - और पूरे कार्यक्रम की निरंतरता पर इसका कब्जा व्यावहारिक रूप से उपयोगी नहीं है। पूरी निरंतरता को कुशलता से पकड़ने के लिए कड़ी मेहनत का एकमात्र पुरस्कार पूरे निरंतरता पर कब्जा करने के लिए कड़ी मेहनत करना है। उपयोगकर्ताओं और कार्यान्वयनकर्ताओं दोनों को बेहतर विचार-विमर्श के साथ सामान्यता के विभिन्न डिग्री के प्राइमरी कंट्रोल प्राइमेटिक्स के सेट के साथ बेहतर सेवा दी जाती है ...

... call/ccएक कोर नियंत्रण सुविधा के रूप में पेश करना, जिसमें अन्य सभी नियंत्रण सुविधाओं को लागू किया जाना चाहिए, एक बुरा विचार है। प्रदर्शन, स्मृति और संसाधन लीक, कार्यान्वयन में आसानी, उपयोग में आसानी, तर्क की आसानी सभी के खिलाफ तर्क call/cc। अगर एक आदिम के रूप में लागू करने के लिए वास्तव में एक प्रतिष्ठित नियंत्रण सुविधा है, तो दूसरों को पुस्तकालयों में वापस ले लिया जाए, ऐसा नहीं है call/cc

डेविड नोलेन ने क्लोजर के लिए एक सीमांकित निरंतरता पुस्तकालय लिखा । कोशिश करके देखो!

delimc

क्लोजर 1.4.0 (और 1.3.0) के लिए एक सीमांकित निरंतरता पुस्तकालय। स्लाव अक्मखेत ( http://defmacro.org ) द्वारा cl-cont पर आधारित अंश ...


2

जबकि क्लॉजुर में कोर-फीचर के रूप में प्रथम श्रेणी में निरंतरता या कोरटाइन नहीं है, यह आपके स्वयं के कार्यान्वयन के लिए संभव है।

उदाहरण के लिए, core.async एक Clojure लाइब्रेरी है जो CSP (समवर्ती अनुक्रमिक प्रक्रियाएँ) मॉडल को लागू करता है। यह goराज्य मशीन के भीतर कोड को बदलने के लिए एक मैक्रो का उपयोग करता है । जबकि वास्तव में प्रति सेरआउट नहीं किया जाता है, इसका उपयोग समान पैटर्न को लागू करने के लिए किया जा सकता है।

वहाँ pulley.cps भी है , एक मैक्रो कंपाइलर जो मैंने लिखा है (ट्रांसफॉर्मर cps/ cps-fnमैक्रोज़) क्लोजर कोड को डायरेक्ट-स्टाइल में निरंतरता-पासिंग स्टाइल में लिखा गया है। मेरे ज्ञान का सबसे अच्छा करने के लिए, यह सबसे पूर्ण निरंतरता थीम्ड क्लोजर कार्यक्रम है। यह डायनेमिक बाइंडिंग, अपवादों का समर्थन करता है, जो मूल और रूपांतरित कोड के बीच आगे और पीछे कॉल करते हैं (हालांकि कंटैक्स के दौरान निरंतरता बनाए नहीं रखी जाती है)। फिलहाल, केवल गर्भपात की निरंतरता (यानी, पारंपरिक call-cc) का समर्थन किया जाता है, लेकिन मेरे पास भविष्य में सीमांकित निरंतरता को लागू करने की योजना है।

जबकि pulley.cps प्रत्यक्ष रूप से प्रति कोरुटीन्स प्रदान नहीं करता है, क्योंकि call-ccयह अपने स्वयं के कार्यान्वयन के लिए अपेक्षाकृत सीधा-आगे है। वास्तव में, उदाहरणों में से एक सहकारी मल्टीटास्किंग का एक सरल कार्यान्वयन है । इसे आगे CSP उदाहरण में बनाया गया है । वहाँ भी एक है पिंग-पोंग उदाहरण है, लेकिन यह अधिक coroutines से पूंछ-कॉल अनुकूलन का एक उदाहरण है।

बेशक, इस प्रकार के परिवर्तन पूरे कार्यक्रम पर लागू होने पर सबसे प्रभावी होते हैं। दुर्भाग्य से, अकेले मैक्रोज़ के साथ यह संभव नहीं है, जो स्थानीयकृत हैं। फिर भी, स्थानीय परिवर्तन भी बहुत प्रभावी हो सकते हैं।


1

क्या क्लोजर में स्टैक ओवरफ्लो के बिना पिंग-पोंगिंग जैसे कार्य करने के लिए निरंतरता या कॉरटाइन्स हैं?

पुराना प्रश्न है, इसलिए मुझे यह भी पक्का नहीं है कि यह सुविधा उस समय उपलब्ध थी, लेकिन किसी को भी "पिंग-पोंग" कार्यक्षमता को लागू करने की इच्छा के लिए, देखें trampoline देखें !

मैंने इसे यहां क्लोजर में कुशल कंटीन्यूएशन-पासिंग स्टाइल पर अपने प्रश्न के उत्तर के रूप में खोजा है: /programming/50952443/continuation-passing-style-does-not-seem-to-make-a -Difference-in-clojure / 50955276 # 50955276 और मुझे लगता है कि यह सिर्फ काम है। मैंने इसके बारे में कुछ समय पहले सुना था, लेकिन कभी पूरी तरह से जांच नहीं की। अधिक मूर्ख मुझे। अन्य प्रस्तावित समाधानों में से कई के विपरीत, यह सिर्फ काम करता है

====== पीएस। ऑनलाइन ट्यूटोरियल जानकारी], यहाँ कुछ उपयोगी हैं


1
शायद दस्तावेज़ को इंगित करने के लिए ट्रैम्पोलिन को लिंक करें?
गूढ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.