क्लोजर बनाम अन्य लिस्प्स [बंद]


93

मेरे प्रश्न का आशय लौ युद्ध शुरू करना नहीं है, बल्कि यह निर्धारित करना है कि प्रत्येक भाषा किन परिस्थितियों में "नौकरी के लिए सबसे अच्छा साधन है।"

मैंने क्लोजर ( प्रोग्रामिंग लौंगुरे , प्रैक्टिकल क्लोजर , द जॉय ऑफ क्लोजर , और मैनिंग अर्ली एक्सेस संस्करण ऑफ क्लोजर इन एक्शन ) पर कई किताबें पढ़ी हैं , और मुझे लगता है कि यह एक शानदार भाषा है। मैं वर्तमान में लेट ओवर लैम्बडा पढ़ रहा हूं जो ज्यादातर कॉमन लिस्प मैक्रोज़ से संबंधित है, और यह भी एक बहुत ही दिलचस्प भाषा है।

मैं एक लिस्प विशेषज्ञ (नौसिखिया से अधिक) नहीं हूं , लेकिन भाषाओं का यह परिवार मुझे आकर्षित करता है, जैसा कि सामान्य रूप से कार्यात्मक प्रोग्रामिंग करता है।

क्लोजर के लाभ (और "अन्य" के नुकसान):

  • जेवीएम पर चलता है।

    • JVM एक बहुत ही स्थिर, उच्च-प्रदर्शन भाषा का वातावरण है जो बहुत अच्छी तरह से "एक बार लिखो, भागो [लगभग] कहीं भी" के सपने को पूरा करता है। मैं अपने मैकबुक प्रो पर कोड लिख सकता हूं, इसे एक निष्पादन योग्य जार फ़ाइल में संकलित कर सकता हूं, और फिर इसे लिनक्स और माइक्रोसॉफ्ट विंडोज पर थोड़े अतिरिक्त परीक्षण के साथ चला सकता हूं।

    • हॉटस्पॉट, और अन्य) जेवीएम उच्च गुणवत्ता वाले कचरा संग्रह और बहुत अच्छा प्रदर्शन करने वाले समय संकलन और अनुकूलन का समर्थन करता है। जहां कुछ साल पहले, मैंने सी में तेजी से चलने के लिए सब कुछ लिखा था, अब मैं जावा में ऐसा करने में संकोच नहीं करता।

    • मानक, सरल, मल्टीथ्रेडिंग मॉडल। क्या कॉमन लिस्प में एक मानक मल्टीथ्रेडिंग पैकेज है?

    • साथ उन सभी कोष्ठकों की एकरसता को तोड़ता है [], {}और #{}है, हालांकि आम लिस्प विशेषज्ञों शायद मुझे बता देगा कि पाठक मैक्रो के साथ, आप सीएल करने के लिए उन जोड़ सकते हैं।

क्लोजर के नुकसान :

  • जेवीएम पर चलता है।
    • कोई पूंछ पुनरावृत्ति या निरंतरता नहीं। क्या कॉमन लिस्प निरंतरता का समर्थन करता है? योजना के लिए दोनों का समर्थन चाहिए, मुझे विश्वास है।

अन्य के लाभ (आम लिस्प, विशेष रूप से) (और क्लोजर के नुकसान):

  • उपयोगकर्ता-निश्चित पाठक मैक्रोज़।

  • अन्य फायदे?

विचार? अन्य अंतर?


15
व्यक्तिगत रूप से मुझे एक प्रकार के कोष्ठक पसंद हैं;) "क्लीनर" कोड जैसा दिखता है
Moe

3
मैं आपके फायदे की सूची पर जो कुछ भी पढ़ता हूं उससे आपको पता चल सकता है कि शायद आप भी एर्लांग www.erlang.org को पसंद कर सकते हैं
पीयर स्ट्रिट्जिंगर

4
क्लोजर "रीअर" विशेष रूप के माध्यम से स्पष्ट पूंछ पुनरावृत्ति का समर्थन करता है। यह आपको पूंछ पुनरावृत्ति के सभी लाभों को प्राप्त करने में सक्षम बनाता है बशर्ते आप स्पष्ट रूप से इसके लिए पूछें (एकमात्र अपवाद यह है कि यह वर्तमान में कई कार्यों के बीच पारस्परिक पूंछ पुनरावर्तन का समर्थन नहीं करता है)।
mikera

1
क्लोजर भी निरंतरता का समर्थन करता है, कम से कम "निरंतरता शैली" के अर्थ में। आप सही हैं कि इसमें प्रथम श्रेणी की निरंतरता नहीं है। देखें stackoverflow.com/questions/1173133/continuations-in-clojure
mikera

@ मिकेरा: एक समारोह में पूंछ-पुनरावृत्ति। एक दूसरे को कॉल करने वाले दो कार्यों को "ट्रम्पोलिनिंग" के साथ किया जाना चाहिए, जो कि कुल्डी की तरह है (लेकिन अपने आप में बहुत सुंदर :-))।
राल्फ

जवाबों:


52

अन्य लिस्प्स के लिए क्लोजर पसंद करने के कारणों की मेरी व्यक्तिगत सूची (पीएस मुझे अभी भी लगता है कि सभी लिस्प्स महान हैं!)।

  • जेवीएम पर चलता है - इसलिए जेवीएम में ही शानदार इंजीनियरिंग के लिए स्वचालित पहुँच प्राप्त होती है (उन्नत कचरा संग्रह एल्गोरिदम, हॉटस्पॉट जेआईटी अनुकूलन आदि)

  • बहुत अच्छा जावा इंटरऑपरेबिलिटी - जावा / जेवीएम भाषा पारिस्थितिकी तंत्र में पुस्तकालयों की विशाल रेंज के साथ संगतता प्रदान करता है। मैंने अलग-अलग जावा पुस्तकालयों को अच्छे प्रभाव से जोड़ने के लिए क्लोजर को एक "गोंद" भाषा के रूप में उपयोग किया है। जैसा कि मैंने बहुत सारे जावा कोड विकसित किए हैं, यह मेरे लिए मददगार है कि क्लोजर जावा टूलिंग के साथ अच्छी तरह से एकीकृत होता है (उदाहरण के लिए, मैं अपने क्लोजर विकास के लिए काउंटरलॉकवाइज प्लगइन के साथ मैवेन, एक्लिप्स का उपयोग करता हूं)

  • वैक्टर [1 2 3], नक्शे {:bob 10, :jane 15}और सेट के लिए अच्छा सिंटैक्स #{"a" "b" "c"}- मैं आधुनिक प्रोग्रामिंग के लिए इन आवश्यक उपकरणों पर विचार करता हूं (पाठ्यक्रम की सूचियों के अलावा!)

  • मुझे व्यक्तिगत रूप से बाइंडिंग फॉर्म के लिए चौकोर कोष्ठकों का उपयोग पसंद है: उदाहरण (defn foo [a b] (+ a b))- मुझे लगता है कि यह कोड को पढ़ने के लिए थोड़ा स्पष्ट करता है।

  • लगातार, अपरिवर्तनीय डेटा संरचनाओं के साथ आलसी, कार्यात्मक प्रोग्रामिंग पर जोर - विशेष रूप से सभी कोर क्लोज़र लाइब्रेरी को डिफ़ॉल्ट रूप से इसका समर्थन करने के लिए डिज़ाइन किया गया है

  • मल्टी-कोर कंसिस्टेंसी के लिए उत्कृष्ट एसटीएम कार्यान्वयन। मेरा मानना ​​है कि क्लजुरे के पास इस समय किसी भी भाषा की सबसे अच्छी संगोष्ठी कहानी है (इस वीडियो को अमीर हिक्की खुद अधिक विस्तार के लिए देखें )

  • यह एक लिस्प -1 (स्कीम की तरह) है, जिसे मैं व्यक्तिगत रूप से पसंद करता हूं (मैं एक कार्यात्मक भाषा में सोचता हूं जो समान नामस्थान में फ़ंक्शन और डेटा रखने के लिए समझ में आता है)


2
एसटीएम के लिए +1। यह अपने आप में, क्लोजर के उपयोग को सही ठहराने के लिए पर्याप्त है।
एंड्रे कारोन

2
आप लाइब्रेरी CLL-STM का उपयोग करके अभी भी एसटीएम प्राप्त कर सकते हैं।
माइक मैनिलोन

2
@ AndréCaron केवल अगर आपको इसकी आवश्यकता है।
राइट

यदि आप एक साधारण वेबप लिखना चाहते थे, और इसे होस्ट करते हैं, तो कहते हैं, एक सस्ता $ 5 / महीना होस्ट, जो स्पष्ट रूप से जेवीएम के कारण क्लोजर के साथ संभव नहीं है, सही?
हेक्साटोनिक

@ हेक्साटॉनिक मैं बहुत अनुभवी नहीं हूं, लेकिन इन दिनों एक जेवीएम नहीं होगा।
मास्टरमैस्ट

25

ध्यान रखें कि क्लोजर एक भाषा और एक कार्यान्वयन है (आमतौर पर जेवीएम पर)। आम लिस्प एक भाषा है जिसमें दस से अधिक विभिन्न कार्यान्वयन हैं। इसलिए हमारे यहां एक श्रेणी बेमेल है। आप उदाहरण के लिए SBCL के साथ Clojure की तुलना कर सकते हैं।

आम तौर पर:

  • कॉमन लिस्प का एक संस्करण JVM: ABCL पर चलता है

  • अधिकांश अन्य सामान्य लिस्प कार्यान्वयन नहीं है

  • अधिकांश सीएल कार्यान्वयन में मल्टीटास्किंग क्षमताएं होती हैं, एक लाइब्रेरी एक सामान्य इंटरफ़ेस प्रदान करती है

  • आम लिस्प में सरणियों के लिए वाक्यविन्यास है। अन्य डेटा प्रकारों के लिए सिंटैक्स उपयोगकर्ता द्वारा लिखा जा सकता है और विभिन्न पुस्तकालयों द्वारा प्रदान किया जाता है।

  • आम लिस्प न तो पूंछ कॉल अनुकूलन और न ही निरंतरता का समर्थन करता है। कार्यान्वयन TCO प्रदान करते हैं और पुस्तकालय निरंतरता के कुछ रूप प्रदान करते हैं।


24

क्लोजर और कॉमन लिस्प के बीच एक महत्वपूर्ण अंतर यह है कि क्लोजर कार्यात्मक प्रोग्रामिंग के बारे में अधिक निर्धारित है। क्लोजर के दर्शन, मुहावरे, और कुछ हद तक भाषा / पुस्तकालय दृढ़ता से प्रोत्साहित करते हैं और कभी-कभी जोर देते हैं कि आप एक कार्यात्मक तरीके से कार्यक्रम करें (कोई साइड इफेक्ट नहीं, कोई परिवर्तनशील स्थिति नहीं)।

कॉमन लिस्प निश्चित रूप से कार्यात्मक प्रोग्रामिंग का समर्थन करता है, लेकिन यह भी परिवर्तनशील राज्य और अनिवार्य प्रोग्रामिंग की अनुमति देता है।

बेशक, कार्यात्मक प्रोग्रामिंग के लिए कई लाभ हैं, संगामिति के क्षेत्र में और अन्यथा। लेकिन बाकी सभी समान हैं, यह भी अच्छा है कि आप प्रत्येक स्थिति के लिए किस दृष्टिकोण का उपयोग करना चाहते हैं। क्लोजर अनिवार्य प्रोग्रामिंग को पूरी तरह से प्रतिबंधित नहीं करता है, लेकिन यह आम लिस्प की तुलना में उस शैली का कम समायोजन है।


3
@ चार्ली फूल: मेरा मानना ​​है कि आम लिस्प में "विशुद्ध रूप से कार्यात्मक" शैली (लगातार डेटा संरचना समर्थन, आदि) में कार्यक्रम करना संभव है, लेकिन इसके लिए अनुशासन की आवश्यकता होती है। सही बात?
राल्फ

2
"कोई साइड इफेक्ट, कोई उत्परिवर्ती राज्य नहीं" पर सिर्फ एक स्पष्टीकरण - क्लोजर में उत्परिवर्तनीय स्थिति होती है (रेफ, परमाणु, एजेंट आदि सभी उत्परिवर्तित होते हैं) लेकिन इसके लिए आपको इसे नियंत्रित तरीके से एक्सेस करना होगा (यानी एसटीएम तंत्र और संबंधित लेन-देन के माध्यम से) अद्यतन अर्थ विज्ञान)
mikera

5
@ मिकेरा: सिवाय इसके कि क्लजुरे जावा पुस्तकालयों के उपयोग पर निर्भर करता है जो प्रयोग करने योग्य हो, और उन सभी पुस्तकालयों को अनिवार्य शैली की आवश्यकता होती है और वे दुष्प्रभावों से भरे होते हैं। मैंने जावा के साथ बाइंडिंग को एक जहर उपहार के रूप में पाया है ...
एंड्रे कैरन

1
@ और - निश्चित रूप से, यदि आप एक ऐसे पुस्तकालय का उपयोग करने का निर्णय लेते हैं, जिसके लिए पारस्परिक राज्य और अनिवार्य शब्दार्थ की आवश्यकता होती है, तो आपको इसका प्रबंधन करना होगा। यह अलग नहीं है यदि आपने किसी अन्य भाषा से इस तरह के पुस्तकालय का उपयोग किया है। लेकिन आपके पास दो सभ्य विकल्प हैं: ए) इस तरह के पुस्तकालयों का उपयोग न करें - आप शुद्ध क्लोजर या बी में पूरी तरह से अच्छा कोड लिख सकते हैं) इन पुस्तकालयों के साथ एक अच्छे क्लोजर-शैली कार्यात्मक इंटरफ़ेस में इंटरफेस की जटिलता को लपेटते हैं, जो आमतौर पर आसान होता है मैक्रोज़ या एजेंट आदि। कुल मिलाकर, मैंने जावा लाइब्रेरीज़ को नुकसान पहुंचाने की क्षमता को पाया है जो समस्या है।
मिकेरा

4
@ मिकेरा: पुस्तकालयों में एक लाभ है। मैं सिर्फ यह इंगित कर रहा हूं कि जावा पुस्तकालयों का उपयोग करना (यह भाषा के लिए रिच हिक्की के प्राथमिक लक्ष्यों में से एक है) वास्तव में क्लोजर के "अन्य लिस्प्स की तुलना में अधिक कार्यात्मक" पहलू के खिलाफ जाता है। मेरी टिप्पणी का मतलब यह था: "जब तक आप इन पुस्तकालयों को फिर से लिखना / लपेटना नहीं चाहते, तब तक आपको अनिवार्य-दिखने वाला कोड मिलेगा और क्लॉजर्स के अच्छे भागों से लाभ नहीं होगा"।
आंद्रे कारन

10

यहां स्कीम (रैकेट ज्यादातर) और क्लोजर की तुलना के साथ एक अच्छा वीडियो है ।

निष्पक्ष होने के लिए, रैकेट में डेटा प्रकारों के लिए भी सिंटेक्स शुगर (अतिरिक्त पाठक सामग्री) (# राशि, #, वर्ग कोष्ठक, आदि) हैं।

इसके अलावा, एक उचित पूंछ कॉल करने के लिए Clojure का एकमात्र तरीका उपयोग करना है recur, जो कि JVM के संकलन का नकारात्मक पक्ष है।

ध्यान दें कि recurक्लोजर में केवल गैर-स्टैक-खपत लूपिंग निर्माण है। कोई टेल-कॉल ऑप्टिमाइज़ेशन नहीं है और अज्ञात सीमा के लूपिंग के लिए स्व-कॉल का उपयोग हतोत्साहित किया जाता है। recurकार्यात्मक है और पूंछ-स्थिति में इसका उपयोग संकलक द्वारा सत्यापित किया गया है। ( विशेष प्रपत्र )।


लिंक मर चुका है मुझे लगता है।
नवफ़ल

1
@nawfal मुझे लगता है कि मैं इसे ठीक किया गया
Daniil

6
लिंक मर चुका है (फिर से?)
थ्रो अवे अकाउंट

1
उस लिंक पर वीडियो की तरह दिखता है यहां पाया जा सकता: vimeo.com/22675078
जीडीपी 2

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