iHiD का अपलोड किया गया अवतार

Sexps की गर्मियाँ आ गईं!

@iHiD
3 साल से अधिक पहले
वीडियो

परिचय

नमस्ते सभी! आशा है आप सब अच्छी तरह हैं।

Exercism में पिछले कुछ हफ्ते बहुत रोमांचक रहे हैं, खासकर Exercism Premium और Exercism Insiders के लॉन्च के साथ। हमारे कुछ शानदार कम्युनिटी कॉल भी हुए हैं, और साइट में कई सुधार लागू हो चुके हैं और कुछ जल्द ही आ रहे हैं। इस समय बहुत कुछ रोमांचक है, लेकिन सबसे ज़्यादा रोमांचक यह है कि हम #12in23 के छठे महीने में प्रवेश कर रहे हैं! यानी एस-एक्सप्रेशन की गर्मियाँ, या इसे प्यार से Summer of Sexps कहें।

हमेशा की तरह, प्रोग्रामिंग की दुनिया के ज्ञानी ऋषि Erik मेरे साथ हैं।

इस महीने हमारे पास पाँच भाषाएँ हैं: Clojure, Common Lisp, Emacs Lisp, Racket और Scheme। इनमें से हर भाषा Lisp भाषा की एक डायलेक्ट है, इसलिए इस वीडियो में अलग-अलग भाषाओं पर बहुत ज़्यादा ध्यान देने के बजाय हम Lisp पर ही थोड़ा और गौर करेंगे, और यह देखेंगे कि इसे खास क्या बनाता है। फिर अंत में हम भाषाओं को संक्षेप में देखेंगे।

लेकिन उससे पहले, कुछ ज़रूरी बातें! Summer of Sexps बैज पाने के लिए आपको जून के दौरान इनमें से किसी एक भाषा में कोई भी पाँच अभ्यास पूरे करने होंगे।

बैज

एक साल भर चलने वाला 12in23 बैज भी है। इसे पाने के लिए आपको उस भाषा में हमारे पाँच फीचर्ड अभ्यास हल करने होंगे। अगर आप यह जून के बाद देख रहे हैं, तो आप यह हिस्सा साल में कभी भी कर सकते हैं, इसलिए आपका कुछ छूटा नहीं है। चूँकि बहुत से लोगों ने पहले कभी Lisp के साथ काम नहीं किया होगा, हमने अपेक्षाकृत आसान अभ्यास चुनने की कोशिश की है, जिनसे आपको अंदाज़ा मिलेगा कि Lisp भाषा कैसी दिखती है।

  • छलांग: बूलियन शर्तों और ट्रुथीनेस के साथ काम करना (और वैकल्पिक रूप से, लेक्सिकल स्कोपिंग)
  • दो-के-एक: स्ट्रिंग को फॉर्मेट करना और वैकल्पिक पैरामीटर के साथ काम करना
  • वर्गों का अंतर: यूज़र-डिफाइंड फंक्शन कॉल करना और प्रीफिक्स नोटेशन में गणित करना
  • रोबोट का नाम: रैंडमनेस, एटम और स्ट्रक्चर्ड डेटा के साथ काम करना
  • ब्रैकेट मिलान: स्ट्रिंग की जाँच के लिए रिकर्शन का उपयोग करना

ये अभ्यास और पिछले महीनों के अभ्यास सभी #12in23 पेज पर मिल सकते हैं।

संक्षिप्त परिचय

तो Lisp-आधारित भाषाएँ। मुझे लगता है, हमें पहले Lisp के बारे में थोड़ा समझने से शुरू करना चाहिए। चलिए Lisp का एक छोटा-सा सामान्य परिचय देते हैं।

Lisp

  • पहली बात ध्यान देने की यह है कि Lisp सबसे पुरानी भाषाओं में से एक है।

  • इसे 1958 में MIT में John McCarthy ने बनाया था, उस समय जब कंप्यूटर पूरे कमरे ऊपर से नीचे तक भर देते थे 🙂

  • Lisp नाम LISt Processing (या LISt Processor) का संक्षिप्त रूप है, जो ऐरे डेटा स्ट्रक्चर के महत्व को दर्शाता है।

  • इसे AI शोध करने के उद्देश्य से डिज़ाइन किया गया था।

  • Lisp लैम्ब्डा कैलकुलस पर आधारित था, जिसे Alonzo Church ने बनाया था। यह गणित में गणना को (सरल रूप में) समझाने की एक औपचारिक प्रणाली है।

  • यह कई कारणों से अविश्वसनीय रूप से प्रभावशाली भाषा है:

  • यह अब भी आम उपयोग में रहने वाली दूसरी सबसे पुरानी उच्च-स्तरीय प्रोग्रामिंग भाषा है (Fortran के बाद)

  • यह पहली उच्च-स्तरीय फंक्शनल प्रोग्रामिंग भाषा थी और इसने वे कई फीचर पेश किए जिन्हें हम आज फंक्शनल प्रोग्रामिंग से जोड़ते हैं।

  • ध्यान दीजिए कि Lisp अभी भी इम्परेटिव प्रोग्रामिंग का समर्थन करता था

  • यह गारबेज कलेक्टर वाली सबसे पहली भाषा थी, जिसने लेखक को मैनुअल मेमोरी मैनेजमेंट से मुक्त कर दिया

  • इसका तुलनात्मक रूप से कम सिंटैक्स और अपेक्षाकृत सरल सिमैंटिक्स इसे शिक्षा के उद्देश्यों के लिए बहुत अच्छा बनाते हैं।

  • इसलिए Lisp (या बेहतर कहें: इसकी एक डायलेक्ट) का उपयोग अक्सर प्रोग्रामिंग सिखाने के लिए किया जाता है

  • इसने बहुत सारी भाषा डायलेक्टों को जन्म दिया है (और अब भी दे रहा है!) (जिनमें से Exercism पर समर्थित डायलेक्टों की चर्चा हम करेंगे)।

  • दूसरे शब्दों में, प्रोग्रामिंग भाषाओं के पेड़ में Lisp जैसी भाषाओं के लिए एक अलग शाखा है (जैसे C जैसी भाषाओं की एक शाखा होती है)।

जब मैंने हाल ही में Haskell के निर्माताओं में से एक Simon Peyton Jones से बात की, तो वे ट्यूरिंग मशीन के आसपास बनी भाषाओं और लैम्ब्डा कैलकुलस के आसपास बनी भाषाओं के अंतर की बात कर रहे थे। अगर आप इस बारे में और जानना चाहते हैं, तो वह इंटरव्यू ज़रूर देखिए।

गोल ब्रैकेट

Lisp में बहुत सारे गोल ब्रैकेट होते हैं, लेकिन यह ज़रूरी नहीं कि बुरी बात हो (जैसे C जैसी भाषाओं में बहुत सारे कर्ली ब्रैकेट होना ज़रूरी नहीं कि बुरा हो)। Lisp भाषाएँ एक ऐसी चीज़ पर आधारित हैं जिसे एस-एक्सप्रेशन कहा जाता है। एस-एक्सप्रेशन (सिंबॉलिक एक्सप्रेशन का छोटा रूप, जिसे sexpr या sexp लिखा जाता है, इसलिए इस महीने के चैलेंज का नाम यही है) डेटा को दर्शाने वाला एक एक्सप्रेशन है। इन्हें मूल Lisp भाषा के लिए बनाया गया और उसी ने इन्हें लोकप्रिय बनाया। एस-एक्सप्रेशन दो रूपों में से एक हो सकता है:

  • एक एटम (जैसे ‘x’)। इन्हें बिना नेस्टेड "वैल्यू" या पेड़ की पत्तियों की तरह सोचिए
  • एक एक्सप्रेशन x . y, जहाँ x और y एस-एक्सप्रेशन हैं। इन्हें जोड़ों की तरह सोचिए, जहाँ y ऐरे में अगला एलिमेंट हो सकता है (अगर कोई हो), या पेड़ में नोड। ध्यान दीजिए कि यह एक रिकर्शन वाली परिभाषा है, जो पत्ती के स्तर पर रुक जाती है। आम तौर पर इस तरह के एस-एक्सप्रेशन के लिए गोल ब्रैकेट इस्तेमाल होते हैं।

एस-एक्सप्रेशन

Lisp में एस-एक्सप्रेशन का उपयोग डेटा और ऐरे दोनों को दर्शाने के लिए किया जाता है। इसलिए, जब भी आप कोई ऐरे बनाते हैं, आप गोल ब्रैकेट इस्तेमाल करेंगे। इसे इन तथ्यों के साथ जोड़िए: ऐरे Lisp की मुख्य डेटा स्ट्रक्चर है (इसीलिए यह नाम है), कुछ Lisp में यह अकेली डेटा स्ट्रक्चर है, तो आपके पास बहुत सारे गोल ब्रैकेट हो जाएँगे। यह दिखाने के लिए कि ऐरे कितने मुख्य हैं, अगर आप Lisp में किसी फंक्शन को कॉल करना चाहते हैं, तो आप एक ऐरे बनाकर ऐसा करते हैं।

दिलचस्प बात यह है कि ऐरे का पहला एलिमेंट (यानी हेड) उस फंक्शन को दर्शाता है जिसे कॉल किया जा रहा है, और बाकी एलिमेंट (यानी टेल) आर्गुमेंट के रूप में पास किए जाते हैं। इसे प्रीफिक्स नोटेशन कहा जाता है (जहाँ ऑपरेटर ऑपरेंड से पहले आता है), जो शुरू में थोड़ा अजीब लग सकता है, लेकिन वास्तव में बहुत उपयोगी है:

  • आप एक ही ऑपरेटर को कई आर्गुमेंट पर लागू कर सकते हैं, बिना ऑपरेटर दोहराए (जैसे (+ 1 2 3))
  • ऑपरेटर प्रीसीडेंस साफ़ तौर पर तय होता है, क्योंकि किसी अलग ऑपरेटर को कॉल करने के लिए आपको वैसे भी नया एस-एक्सप्रेशन बनाना पड़ता है

दिलचस्प बात यह है कि ऐरे का उपयोग सोर्स कोड को दर्शाने के लिए भी किया जाता है, लेकिन हम इस पर बाद में वापस आएँगे।

सामान्य तौर पर, ज़्यादातर Lisp में सिंटैक्स काफी कम और सिमैंटिक्स अपेक्षाकृत सरल होते हैं, जिससे इन्हें सीखना अपेक्षाकृत आसान हो जाता है, और कोड समझना भी आसान हो जाता है। यह कम सिंटैक्स इन्हें कम शक्तिशाली नहीं बनाता! इन दो चीज़ों (कम सिंटैक्स + सरल सिमैंटिक्स) को मिलाकर Lisp भाषाएँ कंपाइलर और इंटरप्रेटर लिखने के लिए आदर्श बन जाती हैं। अगर आप कभी अपना खुद का कंपाइलर बनाना चाहें, तो Lisp बनाना एक अच्छा विकल्प है!

Lisp की शानदार विशेषताएँ

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

भाषाएँ

Scheme

  • 1970 के दशक में MIT AI Lab में Guy Steele और Gerald Sussman ने बनाया।
  • इसकी शुरुआत Carl Hewitt के Actor मॉडल को एक छोटे Lisp इंटरप्रेटर के ज़रिए समझने की कोशिश के रूप में हुई।
  • यह भाषा खुद शोध AI Memos की एक श्रृंखला में पेश की गई, जिन्हें सामूहिक रूप से Lambda Papers कहा जाने लगा।
  • यह लेक्सिकल स्कोपिंग इस्तेमाल करने वाली पहली Lisp डायलेक्ट थी (वैल्यू केवल वहीं स्कोप में रहती हैं जहाँ वे परिभाषित होती हैं) और फर्स्ट-क्लास कंटीन्यूएशन का समर्थन करने वाली पहली भाषाओं में से एक।
  • आधिकारिक IEEE मानक और एक वास्तविक मानक जिसे Revised Report on the Algorithmic Language Scheme (RnRS) कहा जाता है।
  • कई इम्प्लीमेंटेशन: ChezScheme, Guile (दोनों Exercism पर समर्थित), MIT/GNU Scheme और Racket
  • बहुत कम सिंटैक्स वाली भाषा, लेकिन यह जानबूझकर नहीं था।
  • लेखकों ने कुछ जटिल बनाने की कोशिश की, लेकिन अंत में उन्होंने जितना सोचा था उससे कहीं ज़्यादा सरल चीज़ डिज़ाइन कर दी
  • उचित टेल रिकर्शन। इटरेशन करने का आम तरीका रिकर्शन के ज़रिए है।
  • Scheme टेल रिकर्शन कॉल को इस तरह ऑप्टिमाइज़ करता है कि स्टैक स्पेस या दूसरे संसाधन खर्च न हों। इसका मतलब है कि रिकर्शन का उपयोग कितने भी बड़े डेटा पर या कितनी भी लंबी गणना के लिए किया जा सकता है
  • शक्तिशाली न्यूमेरिक डेटा टाइप, जिनमें रेशनल और कॉम्प्लेक्स संख्याएँ शामिल हैं
  • डिलेड इवैल्यूएशन, जो प्रॉमिस की तरह है।
  • शक्तिशाली मैक्रो सिस्टम।
  • हाइजीनिक मैक्रो मैक्रो बनाते समय अनपेक्षित परिणामों की संभावना कम करते हैं।

Common Lisp

  • Common Lisp पर काम 1981 में ARPA प्रबंधक Bob Engelmore की पहल के बाद शुरू हुआ, जिसका उद्देश्य एक ही कम्युनिटी मानक Lisp डायलेक्ट बनाना था, क्योंकि उस समय इस्तेमाल हो रही अलग-अलग डायलेक्ट अक्सर असंगत थीं, जिसका मतलब था कि कोड और ज्ञान साझा नहीं किए जा सकते थे
  • पहला मानक 1984 में और अंतिम 1994 में प्रकाशित हुआ (बहुत स्थिर स्पेक)
  • मानक होने के नाते, इसके अलग-अलग इम्प्लीमेंटेशन हैं, जैसे Steel Bank Common Lisp (जो Exercism का डिफ़ॉल्ट है) और CLisp।
  • कुछ कमर्शियल इम्प्लीमेंटेशन भी हैं, जैसे Allegro CL और LispWorks, साथ ही ECL (Embeddable Common Lisp) जिसे C प्रोग्राम में एम्बेड किया जा सकता है, और ABCL जो Java Virtual Machine पर चलता है।
  • मानक (ANSI INCITS 226-1994) द्वारा परिभाषित, इसलिए 30 साल पहले लिखा कोड आज भी ठीक चलता है
  • समृद्ध और एक्सटेंसिबल टाइप सिस्टम
  • इमेज और REPL डेवलपमेंट के लिए डिज़ाइन किया गया, इसलिए बहुत इंट्रोस्पेक्ट करने योग्य।

Emacs Lisp

  • 1985 में एक टेक्स्ट एडिटर को एक्सटेंड करने के लिए कुशल भाषा देने के उद्देश्य से विकसित किया गया
  • डायनैमिकली टाइप्ड
  • Emacs का लगभग 80% Emacs Lisp में लिखा गया है (परफॉर्मेंस के कारण 20% C में)
  • दूसरे Lisp से थोड़ा अलग:
  • मानकीकृत नहीं, अब भी धीरे-धीरे विकसित हो रहा है
  • स्वचालित टेल-कॉल एलिमिनेशन नहीं, named-let मैक्रो के ज़रिए समर्थन (while-loop में बदल जाता है)
  • डिफ़ॉल्ट रूप से डायनैमिक स्कोपिंग, नए कोड के लिए लेक्सिकल स्कोपिंग की सिफारिश की जाती है
  • एडिटर के अंदर अच्छा डॉक्यूमेंटेशन
  • मल्टी-प्लेटफॉर्म (वहीं चलता है जहाँ Emacs चलता है)
  • रोज़मर्रा इस्तेमाल की जा रही कार्यक्षमता का कोड पढ़कर भाषा सीखिए (Emacs Core + Packages)
  • cl-lib पैकेज के ज़रिए Common Lisp का एक सबसेट उपलब्ध है। Emacs Lisp काफी मिनिमलिस्ट है, जबकि Common Lisp उससे कहीं ज़्यादा फीचर-संपन्न है। cl-lib पैकेज CL का एक सबसेट उपलब्ध कराता है

Racket

  • Matthias Felleisen ने PLT Inc. की स्थापना की, जिसने जनवरी 1995 में Scheme पर आधारित एक शैक्षिक प्रोग्रामिंग वातावरण बनाने का फैसला किया। शुरू में इसका नाम PLT Scheme था, बाद में इसे Racket कर दिया गया।
  • शैक्षिक प्रोग्रामिंग वातावरण होने के अलावा, इसे प्रोग्रामिंग भाषा डिज़ाइन और इम्प्लीमेंटेशन के लिए एक प्लेटफॉर्म के रूप में डिज़ाइन किया गया था।
  • आधुनिक LISP, Scheme का वंशज
  • लॉजिक प्रोग्रामिंग का समर्थन करता है!
  • सरल, अभिव्यक्तिपूर्ण सिंटैक्स जो शुरुआती लोगों के लिए आदर्श है और विशेषज्ञों के हाथों में शक्तिशाली भी
  • कई प्रोग्रामिंग पैराडाइम का समर्थन करता है: फंक्शनल प्रोग्रामिंग, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, डिज़ाइन बाय कॉन्ट्रैक्ट, लॉजिक प्रोग्रामिंग, मेटाप्रोग्रामिंग
  • एक व्यापक मानक लाइब्रेरी
  • DrRacket के साथ आता है, जो सीखने और खोजने के लिए बनाया गया एक पूरा IDE है, जिसमें न्यूनतम झंझट होती है
  • बहुत बढ़िया डॉक्यूमेंटेशन, जिसमें ढेर सारी पृष्ठभूमि जानकारी और उदाहरण हैं

Clojure

  • Rich Hickey ने इस लक्ष्य से बनाया कि एक आधुनिक LISP हो जो JVM पर चले और जिसमें बढ़िया कंकरेंसी हो
  • LISP की डायलेक्ट, लेकिन दूसरे LISP से कुछ अलग भी है क्योंकि यह इम्प्लिसिट टेल रिकर्शन का समर्थन नहीं करता (अगर आप नहीं जानते कि यह क्या है तो चिंता न कीजिए) और इसमें सिर्फ ऐरे ही नहीं, बल्कि और भी डेटा स्ट्रक्चर हैं: maps/sets/vectors। इन सभी डेटा स्ट्रक्चर का अपना लिटरल सिंटैक्स है।
  • ये सभी इम्यूटेबल भी हैं, लेकिन फिर भी O(log32 n) लुकअप के साथ बढ़िया परफॉर्मेंस देते हैं, जो "प्रभावी रूप से" कॉन्स्टेंट टाइम है
  • मल्टीमेथड और प्रोटोकॉल के ज़रिए रनटाइम पॉलीमॉर्फिज़्म
  • बढ़िया JVM इंटरऑप
  • Clojure Spec डेटा स्पेसिफिकेशन सिस्टम (रनटाइम, कंपाइल-टाइम नहीं), जो आपको डेटा की संरचना परिभाषित करने, डेटा जनरेट करने, प्रॉपर्टी-आधारित टेस्टिंग और बहुत कुछ करने देता है

उपयोग के मामले

Scheme

  • कंप्यूटर साइंस सिखाने में मदद के लिए शिक्षा में इस्तेमाल होता है (प्रभावशाली Structure and Interpretation of Computer Programs में Scheme का उपयोग हुआ है)।
  • AI में इस्तेमाल होता है। स्क्रिप्टिंग भाषा के रूप में, जैसे GIMP (ग्राफिक्स एडिटर), CAD टूल (Computer Aided Design) और यहाँ तक कि फिल्मों में भी, जहाँ Final Fantasy: The Spirit Within के रेंडरिंग इंजन मैनेजमेंट स्क्रिप्ट में इसका उपयोग हुआ

Common Lisp

  • Common Lisp का उपयोग कई जगहों पर होता है, जैसे आर्टिफिशियल इंटेलिजेंस और शोध में, लेकिन कमर्शियल एप्लीकेशन में भी: NASA ने Deep Space One अंतरिक्ष यान का ऑटोपायलटिंग सॉफ्टवेयर Common Lisp में लिखा, Viaweb को Common Lisp में लिखा गया था, जिसे बाद में Yahoo ने खरीदा और Yahoo Store! के नाम से नया ब्रांड दिया, और Reddit का पहला वर्ज़न भी

Emacs Lisp

  • Emacs Lisp का उपयोग, तो, Emacs में ही होता है!
  • मूल रूप से, Emacs, Emacs Lisp के लिए एक इंटरप्रेटर है, जो Lisp प्रोग्रामिंग भाषा की एक डायलेक्ट है, लेकिन टेक्स्ट एडिटिंग के समर्थन के लिए इसमें अतिरिक्त एक्सटेंशन जोड़े गए हैं

Racket

  • शिक्षा में इस्तेमाल होता है, क्योंकि Racket को भाषा निर्माण, सरलीकरण और विश्लेषण के समर्थन पर ज़ोर देकर डिज़ाइन किया गया था।
  • शोध में इस्तेमाल होता है, क्योंकि इसका एक्सटेंसिबल सिंटैक्स और सिमैंटिक्स इसे नई भाषाओं और भाषा फीचरों को डिज़ाइन करने और प्रोटोटाइप बनाने के लिए उपयुक्त बनाते हैं।
  • गेम्स में इस्तेमाल होता है, जैसे John Carmack (Doom की शोहरत वाले) ने VR के लिए एक इंटरैक्टिव स्क्रिप्टिंग वातावरण में, और डेवलपर Naughty Dog ने स्क्रिप्टिंग के लिए (जैसे Uncharted में) इसका उपयोग किया। Hacker News को Arc में लिखा गया है, जो खुद भी एक Lisp है, और Arc खुद Racket में लिखा गया है।

Clojure

  • Clojure का उपयोग कई अलग-अलग चीज़ों के लिए होता है, जिनमें 2022 में Docker द्वारा Atomist का अधिग्रहण भी शामिल है, जो Clojure में बनाया गया कंटेनर सुरक्षा और ऑटोमेशन प्लेटफॉर्म है।
  • दुनिया में Clojure का सबसे बड़ा उपयोगकर्ता Nubank है, एक नया बैंक, जिसने कुछ साल पहले इसे खरीदा और अब Core Clojure टीम को रखता है।
  • यह तेज़ प्रोटोटाइपिंग के लिए बहुत इस्तेमाल होता है, क्योंकि यह डायनैमिक और अत्यधिक इंटरैक्टिव है।

प्रोग्रामिंग के नज़रिए से

सभी भाषाएँ फंक्शनल, इम्परेटिव और सिंबॉलिक पैराडाइम का समर्थन करती हैं। इनमें से कुछ OOP का भी समर्थन करती हैं, खासकर Common Lisp।

Lisp भाषाएँ ज़्यादातर डायनैमिक भाषाएँ हैं, हालाँकि Racket स्टैटिक टाइपिंग का समर्थन करता है।

इसका मतलब यह नहीं कि ये सब इंटरप्रेटेड हैं, क्योंकि इनमें मिश्रण है: इंटरप्रेटेड (बिना किसी कंपाइलेशन स्टेप के), बाइटकोड में कंपाइल होकर फिर इंटरप्रेट होना, और सीधे मशीन कोड में कंपाइल होने के विकल्प।

Scheme

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

Common Lisp

  • प्रोग्रामेबल मेथड कॉम्बिनेशन वाला एक्सटेंसिबल ऑब्जेक्ट ओरिएंटेड सिस्टम (दोनों तरह से: सब/सुपर-क्लास मेथड कैसे मिलाए जाते हैं, और before, after तथा around मेथड, जो सिस्टम को बदले बिना उनका विस्तार करने देते हैं)
  • प्रोग्रामेबल कंडीशन सिस्टम ('exceptions' का सुपरसेट) जो शर्तों को पहचानने और उन्हें कैसे संभाला जाए, इन दोनों को अलग करने देता है। कंडीशन सिस्टम एक्सेप्शन सिस्टम से ज़्यादा लचीला है, क्योंकि एरर सिग्नल करने वाले कोड और उसे संभालने वाले कोड के बीच दो हिस्सों में बँटवारा करने के बजाय, कंडीशन सिस्टम जिम्मेदारियों को तीन हिस्सों में बाँटता है: कंडीशन सिग्नल करना, उसे संभालना, और रीस्टार्ट करना।
  • मैक्रो भाषा के सिंटैक्स को बढ़ाने देते हैं, सिर्फ बॉयलरप्लेट कोड जनरेट करने के लिए नहीं। इससे इंसान डोमेन के हिसाब से भाषा बना पाता है, न कि उलटा।

Emacs Lisp

  • बढ़िया एडिटर समर्थन और इंटीग्रेशन
  • Emacs चलते-चलते उसे कस्टमाइज़ करने के लिए इस्तेमाल किया जा सकता है ("खुद पर ब्रेन सर्जरी करने जैसा" :))
  • बैच मोड में इस्तेमाल किया जा सकता है, जिसमें टेक्स्ट प्रोसेस करने की एडिटर की सारी क्षमताएँ आपके पास उपलब्ध होती हैं (जैसे बफर और मूवमेंट कमांड)

Racket

  • शक्तिशाली मैक्रो सिस्टम। थ्रेडिंग मैक्रो जैसी सिंटैक्स शुगर इसी पर बनी है। मैक्रो हाइजीनिक भी होते हैं, जो एक साधारण सवाल का जवाब है: एक मैक्रो ऐसा कोड जनरेट करता है जो कहीं और जमा हो जाता है। जब वह कोड इवैल्यूएट होता है, तो अंदर के आइडेंटिफायर की बाइंडिंग हम कैसे तय करें? हाइजीनिक मैक्रो मैक्रो बनाते समय अनपेक्षित परिणामों की संभावना कम करते हैं।
  • भाषा-केंद्रित।
  • Racket के साथ अपनी खुद की प्रोग्रामिंग भाषा या DSL लिखने के टूल आते हैं, जो Racket के मैक्रो पर बने हैं।
  • कई बिल्ट-इन भाषाएँ, जैसे typed Racket (स्टैटिकली जाँचे गए टाइप एनोटेशन का समर्थन), datalog (Prolog जैसी भाषा), जिसका DrRacket IDE समर्थन करता है, और scribble, जो HTML या PDF रूप में गद्य दस्तावेज़ बनाने का टूल है
  • REPL डेवलपमेंट वर्कफ्लो का मुख्य हिस्सा, सिर्फ चीज़ें आज़माने या डॉक्स देखने के लिए नहीं

Clojure

  • शक्तिशाली मैक्रो सिस्टम।
  • थ्रेडिंग मैक्रो जैसी सिंटैक्स शुगर इसी पर बनी है
  • REPL डेवलपमेंट वर्कफ्लो का मुख्य हिस्सा, सिर्फ चीज़ें आज़माने या डॉक्स देखने के लिए नहीं

किसे आज़माएँ

  • अगर आपने कभी Lisp आज़माया नहीं है, तो Scheme और Racket बढ़िया विकल्प हैं क्योंकि दोनों का सिंटैक्स बहुत कम है।
  • फिर भी, Common Lisp और Clojure दोनों में Learning Mode है, इसलिए Exercism पर सीखने के लिए शायद वही सबसे अच्छे हैं।
  • अगर आप पहले से Emacs इस्तेमाल करते हैं, तो Emacs Lisp स्वाभाविक विकल्प है।
  • इसी तरह, अगर आप JVM भाषा इस्तेमाल करते हैं, तो Clojure स्वाभाविक विकल्प है।
  • Emacs Lisp (Emacs के ज़रिए), Clojure (IntelliJ के ज़रिए) और Racket (DrRacket के ज़रिए) सभी में बढ़िया IDE समर्थन है।
  • बेशक Common Lisp और Scheme के लिए भी अच्छे IDE हैं।
  • अगर आपको सचमुच पूरी सुविधाओं वाला Lisp चाहिए, तो Common Lisp, Clojure और Racket बहुत विस्तृत हैं
  • अगर आपको थोड़ा अलग Lisp चाहिए, तो Clojure में Lisp के लिए कुछ काफी अनोखा सिंटैक्स है।
  • अगर आपको मैक्रो और मेटा-प्रोग्रामिंग में दिलचस्पी है, तो असल में ये सब अच्छे विकल्प हैं! लेकिन अगर आप नई भाषाएँ बनाना चाहते हैं, तो Racket खास तौर पर बढ़िया है

बेशक, अगर आपके पास समय है तो मैं सलाह दूँगा कि आप दो-तीन आज़माकर देखें! साथ ही, गोल ब्रैकेट से डरिए मत! मुझे पता है मैं डरता था, इसीलिए मैंने काफी समय तक Lisp सीखना टाल दिया। लेकिन आप जल्दी ही इनके आदी हो जाएँगे और शायद इनकी कद्र करने लगेंगे, जैसे मैं करने लगा। असल में, अब मुझे Lisp भाषाएँ बहुत पसंद हैं, कम सिंटैक्स, आसान सिमैंटिक्स के साथ, और फिर भी बहुत अभिव्यक्तिपूर्ण।

01 जून 2023 · क्या यह काम की लगी?