क्या लिस्प में अभी भी कोई विशेष विशेषता है जिसे अन्य प्रोग्रामिंग भाषाओं द्वारा नहीं अपनाया गया है?


35

क्या लिस्प में अभी भी कोई विशेष विशेषता है जिसे अन्य प्रोग्रामिंग भाषाओं द्वारा नहीं अपनाया गया है?

लिस्प द्वारा, मेरा मतलब है कि सभी लिस्प प्रोग्रामिंग भाषाएं हैं। मुझे बताया गया है कि लिस्प कितना अद्भुत है और जानता है कि कई भाषाएं लिस्प से प्रेरित हैं। लेकिन क्या लिस्प में अभी भी कोई विशेष डिज़ाइन सुविधा है जो किसी अन्य भाषा में नहीं की जा सकती है?

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

क्या मुझे कुछ याद आया और "लिस्प अभी भी अलग है"?

या मैं भाग्यशाली हूं क्योंकि अन्य आधुनिक भाषाओं ने लिस्प से सभी अच्छे हिस्सों को चुराया है ताकि यह कोष्ठक लिस्प दुनिया में खुदाई करने के लिए आवश्यक न हो , और "लिस्प अलग था"।


3
अपने शोध को साझा करना हर किसी की मदद करता है। हमें बताएं कि आपने क्या प्रयास किया है और यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है। यह दर्शाता है कि आपने खुद को मदद करने का प्रयास करने के लिए समय लिया है, यह हमें स्पष्ट उत्तरों को दोहराने से बचाता है, और सबसे अधिक यह आपको अधिक विशिष्ट और प्रासंगिक उत्तर प्राप्त करने में मदद करता है। यह भी देखें कि कैसे पूछें
gnat

3
सलाह के लिए @gnat Thx, और मैंने अपना प्रश्न अपडेट किया है :)
iceX

10
एक समस्या यह है कि, एक बार किसी भाषा में लिस्प विशेषताओं (उदाहरण के लिए, एस-एक्सप्रेशन और मैक्रोज़) की एक निश्चित सबसेट होती है, लोग दावा करते हैं कि यह एक लिस्प है। कौन से पाठ्यक्रम का परिणाम है कि (इन लोगों के अनुसार) किसी भी गैर-लिस्प भाषा में ये विशेषताएं नहीं हो सकती हैं।

9
मुझे लगता है कि कोई अन्य भाषा नहीं है जहाँ गोल कोष्ठक सब कुछ के लिए समूहीकरण का एक ही रूप है :-)
डॉक्टर ब्राउन

लिस्प के रूप में एक परिवार बहुत अनोखा नहीं हो सकता है, लेकिन बहुत सारी लिस्प बोलियाँ (रैकेट, सीएल, स्कीम, क्लोजर) अभी भी बहुत सी उपयोगी / अनूठी विशेषताओं की पेशकश करती हैं।
डैनियल ग्रैज़र

जवाबों:


28

इस प्रकार के प्रश्न के लिए एक कैनोनिकल संदर्भ पॉल ग्राहम की व्हाट मेड लिस्प डिफरेंट है । लिस्प की दो शेष प्रमुख विशेषताएं जो व्यापक रूप से उपलब्ध नहीं हैं, इस लेख के अनुसार इसके लेखन के समय हैं:

8. प्रतीकों के पेड़ों का उपयोग करके कोड के लिए एक संकेतन

9. पूरी भाषा हमेशा उपलब्ध है। रीड-टाइम, संकलन-समय और रनटाइम के बीच कोई वास्तविक अंतर नहीं है। आप पढ़ते समय, कोड पढ़ते या चलाते समय कोड को संकलित या चला सकते हैं, और रनटाइम पर कोड को पढ़ या संकलित कर सकते हैं।

कमेंट्री प्रत्येक बिंदु को संबोधित करती है और लोकप्रिय भाषाओं को नाम देती है जहां यह सुविधा उपलब्ध है।

8, जो (9 के साथ) वह है जो लिस्प मैक्रोज़ को संभव बनाता है, क्या अब तक लिस्प के लिए अभी तक अद्वितीय है, शायद इसलिए (क्योंकि) इसे उन पैरेन्स की आवश्यकता होती है, या बस कुछ बुरा के रूप में, और (बी) यदि आप शक्ति के अंतिम वृद्धि को जोड़ते हैं। , आप अब एक नई भाषा का आविष्कार करने का दावा नहीं कर सकते हैं, लेकिन केवल लिस्प की एक नई बोली तैयार की है; -)

ध्यान दें कि यह लेख अंतिम बार 2002 में संशोधित किया गया था, और पिछले 11 वर्षों में नई भाषाओं की एक विस्तृत विविधता रही है, जिनमें से कुछ इन सभी लिस्प सुविधाओं को अपने डिजाइन में शामिल कर सकते हैं।


2
उन सुविधाओं को लिस्प (और सीधे-व्युत्पन्न प्रकार) के लिए अद्वितीय नहीं है, और काफी लंबे समय से नहीं है।
डोनल फैलो

21
@iceX: जावास्क्रिप्ट और भाषाओं जैसे लिस्प, स्मॉलटाक, सेल्फ, न्यूजक, एपीएल, फैक्टर, फोर्थ आदि के बीच अंतर यह है कि जावास्क्रिप्ट में, प्रोग्राम "मृत" हैं। वे पाठ फाइलें हैं। आप रनिंग प्रोग्राम को मारते हैं, टेक्स्ट फाइल को एडिट करते हैं, फिर प्रोग्राम की पूरी तरह से नई कॉपी शुरू करते हैं। उन अन्य (तथाकथित "जीवंत" वातावरण) में, आप कभी भी चलने वाले कार्यक्रम को नहीं रोकते हैं, चल रहा कार्यक्रम स्वयं स्मृति में वस्तुओं का एक सेट है जिसे आप उसी तरह से हेरफेर करते हैं जैसे आप किसी अन्य ऑब्जेक्ट को हेरफेर करते हैं , जबकि यह चल रहा है । (नोट: यह क्लोजर के लिए सच नहीं है, लेकिन ज्यादातर पुराने लिस्प्स इस तरह से करते हैं।)
जोर्ग डब्ल्यू

2
@ JörgWMittag वाह ... तो, क्लोजर, क्लोजरस्क्रिप्ट, लिस्पस्क्रिप्ट जैसी प्रोग्रामिंग भाषाएं, वास्तव में "वास्तविक लिस्प" नहीं हैं, क्योंकि वे अपने कोड को पुराने लिस्प के तरीके से नहीं बदल सकते हैं, जैसे कॉमन लिस्प करता है। लेकिन ... अगर वे इसे बदल नहीं सकते ... तो एस-एक्सप्रेशन का उपयोग करने के लिए परेशान क्यों हूं जो मुझे लगा कि कोड हेरफेर के उद्देश्य से है ... (जैसे मैं सिर्फ एक गहरे, गहरे खरगोश छेद में गिर गया)
iceX

4
@iceX: कई भाषाओं में evalया समान है, और काफी कुछ मेटाप्रोग्रामिंग कर सकते हैं, जैसे हास्केल का टेम्पलेट हास्केल। लिस्प के बारे में (यकीनन) अनोखी बात यह है कि डेटा, कोड और मेटा-कोड के लिए प्रतिनिधित्व समान है - न केवल वाक्यविन्यास में, बल्कि यह वास्तव में एक ही बात है।
tdammers

2
@iceX Eval इसका केवल एक हिस्सा है, लेकिन यह सब नहीं है। लिस्प में आप संकलन समय पर कोड निष्पादित कर सकते हैं। आप रीड टाइम पर कोड निष्पादित कर सकते हैं। हाँ क्लोजर, लिस्प की गतिशीलता का सभी का समर्थन करता है, इसमें मैक्रोज़, रीडर मैक्रोज़ और इवैल है, साथ ही मक्खी पर इसे संशोधित करने के लिए एक रनिंग प्रोग्राम को आरईपीएल संलग्न करने की क्षमता है।
पत्थरबाज

15

प्रश्न का उत्तर देना मुश्किल है, क्योंकि किसी को यह जानने के लिए सभी भाषाओं को जानना होगा कि लिस्प में कोई अन्य विशेषता उपलब्ध नहीं है, इसलिए निम्नलिखित उन भाषाओं पर आधारित है जिनके साथ मेरा अनुभव है।

मेरे सिर के ऊपर, स्थितियाँ कुछ ऐसी हैं जो मैंने किसी अन्य भाषा में नहीं देखी हैं। 'अपवाद' के बारे में सोचें, लेकिन जहां कॉल स्टैक निराधार नहीं है, और जहां कॉलर अपवाद साइट पर एक पुनर्प्राप्ति मूल्य भेज सकता है, लेकिन हैंडलर और अपवाद के स्रोत के बीच कॉल स्टैक को परेशान किए बिना । निष्पक्ष होने के लिए, यह वास्तव में निरंतरता का एक विशेष अनुप्रयोग है, इसलिए रूबी और स्कीम (कम से कम) ऐसा कर सकते हैं।

लिस्प की मैक्रो प्रणाली नियमितता / समरूपता से लाभान्वित होती है, लेकिन स्काला उन्हें 2.12 में एक स्थिर सुविधा के रूप में शामिल करने की योजना बना रही है और टेम्पलेट हास्केल समान सुविधाओं का दावा करती है। मेरा तर्क है कि वे लिस्प के साथ तुलनात्मक रूप से अधिक जटिल होंगे, लेकिन कोड के संकलन-समय की परवाह किए बिना।

यह सोचने के लिए आओ, हालांकि, रूपों का सीधा निर्माण केवल लिस्प में उपलब्ध मैक्रो का एक प्रकार है: मैंने कहीं भी संकलक या रीडर मैक्रोज़ के बराबर नहीं देखा है।

कुछ बोलियों (उदाहरण के लिए एसबीसीएल ) की क्षमता एक पूर्ण, फिर से शुरू करने योग्य प्रक्रिया छवि को बचाने के लिए शांत है, लेकिन फिर से यह अद्वितीय नहीं है: स्मॉलटाकल दशकों से कर रहा है।

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

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


3
स्काला मैक्रोज़ लिस्प मैक्रोज़ की तुलना में बहुत कम शक्तिशाली हैं, साथ ही टीएच मैक्रोज़, स्कीम हाइजीनिक मैक्रोज़ इत्यादि भी मेटालाउ और कन्वर्ज में समान रूप से शक्तिशाली प्रणाली पाई जा सकती है।
SK- तर्क

4

इतने दशकों के बाद, मुझे नहीं लगता कि लिस्प के लिए कुछ विशेष है। लेकिन आज भी, कई दिलचस्प चीजें हैं जो लिस्प्स के बाहर खोजना मुश्किल है। कुछ बातें जो मन में आती हैं:

  • परिष्कृत मेटा-प्रोटोकॉल (यानी CLOS) के साथ एक उच्च-गुणवत्ता वाली वस्तु प्रणाली दूरस्थ रूप से लोकप्रिय नहीं है।
  • बहु-विधियाँ समय-समय पर कहीं न कहीं आती रहती हैं, लेकिन ज्यादातर लोगों ने उनके बारे में कभी नहीं सुना।
  • जैसा कि दूसरों ने बताया है, स्थिति अपवाद अपवाद अपवाद तंत्र की तुलना में काफी परिष्कृत है।
  • भाषा के शब्दार्थ (eval) का एक कॉम्पैक्ट प्रतिनिधित्व, किसी की भाषा को परिभाषित करने के लिए एक सशक्त दृष्टिकोण और इसे सीधे गहरी अनुकूलन के लिए उपलब्ध कराना (देखें SICP ) - वर्तमान लोकप्रिय भाषाओं के "eval" फ़ंक्शन बस समान गुणों को साझा नहीं करते हैं।

अंत में, लिस्प से सीखने के लिए बहुत कुछ है जो भाषा के बारे में नहीं है, लेकिन लिस्प इतिहास का हिस्सा बन गया और समय के साथ खो गया। जैसे Interlisp, Symbolics Genera, etc ... यदि आप Genera पर कभी हाथ नहीं डालते हैं, तो इस comp.lang.lisp धागे को देखें, जहाँ Kent Pitman वर्णन करते हैं कि "Emacs Genera के Zmacet का केवल एक पीला छाया है" - जो सभी द्वारा सक्षम था एक शक्तिशाली लिस्प प्रणाली का होना जो ज़मेक का हिस्सा था, जो एक लिस्प मशीन पर चलता था।


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

उनके महत्वपूर्ण भेद हैं। यदि आप उस संसाधन को खोजने में परेशानी में हैं, तो आप हमेशा एक नया सवाल बना सकते हैं ..
थियागो सिल्वा

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

4

जरूरी नहीं कि यह एक निश्चित सिंगल फीचर हो । यह संपूर्ण लुक और फीलिंग है, और कुछ निश्चित फीचर एक साथ कैसे काम करते हैं।

जावास्क्रिप्ट या जावा में लिस्प (आभासी मशीन, संकलक / मूल्यांकनकर्ता, कचरा संग्रह, आदि) की बहुत सारी विशेषताएं हैं। लेकिन उदाहरण के लिए जावास्क्रिप्ट में प्रतीकात्मक प्रोग्रामिंग भाग का अभाव है, इसमें गणितीय क्षमताओं का अभाव है (आंतरिक रूप से इसमें केवल तैरता है), इसमें त्रुटि से निपटने की कमी है, और इसी तरह।

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

अब एक प्रोग्राम को विस्तारित करने के लिए जावास्क्रिप्ट जैसे कुछ का उपयोग किया जाता है, आमतौर पर एक वेब ब्राउज़र। लेकिन अधिकांश समय जावास्क्रिप्ट में मेटा-प्रोग्रामिंग नहीं होती है - कुछ ओओपी हैकरी के अलावा ।

उदाहरण:

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

(पायथन में भी एक या एक से अधिक लिखे गए हैं।)

ऐसे कई सिस्टम नहीं हैं , जो Axiom जैसी किसी चीज़ के फीचर सेट की पेशकश करते हैं , जो कॉमन लिस्प के शीर्ष पर चलता है।

इन प्रकार के अनुप्रयोगों के लिए लिस्प को आकर्षक बनाया गया है: सुविधाओं का मिश्रण: उन्नत बुनियादी गणित (bignums, अनुपात, ...), प्रतीकात्मक संगणना, इंटरैक्टिव संकलक, आदि। इन चीजों को कम में लागू करके प्राप्त करना काफी संभव है। स्तर की भाषा। इस तरह, एक ठेठ लिस्प प्रणाली के 50% या अधिक को लागू किया जाएगा।


2

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

: (   41 word drop ; immediate
( That was the definition for the comment word. )
( Now we can add comments to what we are doing! )

1
जैसा कि फोर्थ को मजेदार लगता है, मैंने हमेशा इसे निराशाजनक रूप से अपारदर्शी और अजीब पाया, शायद इसलिए क्योंकि यह स्टैक-आधारित है और सब कुछ उलट है।
रॉबर्ट हार्वे

2
जिज्ञासा से बाहर, 'भाषा के मुख्य भाग से अलग' से आपका क्या तात्पर्य है? लिस्प में मैक्रोज़ को उस बिंदु पर परिभाषित सभी कार्यों तक पूर्ण पहुंच है जो मैक्रो परिभाषित है, जिनमें से किसी का उपयोग उस फॉर्म को बनाने के लिए किया जा सकता है जो मैक्रो का विस्तार करता है। इसमें डेटाबेस और / या सर्वर से प्राप्त जानकारी शामिल हो सकती है। आपकी टिप्पणी उदाहरण, के रूप में परिभाषित किया जा सकता है: (defmacro टिप्पणी (और बाकी शरीर)), यह नहीं कर सकता?
डैनी वुड्स

1
@ डैनीवूड्स का मतलब है कि मैक्रोज़ नियमित कोड की तरह नहीं दिखते। कम से कम क्लोजर में आप नियमित कोड से मैक्रो कोड बता सकते हैं क्योंकि यह वाक्यविन्यास उद्धरण, अनूठे splicing, आदि का उपयोग करता है जो नियमित कोड में असामान्य है। उदाहरण के लिए अगले कोड मैंने दिया सामान्य कोड की तरह लग रहा है जब तक आप तत्काल देखते हैं। मेरे जवाब को फिर से जारी करना सिर्फ खराब तरीके से व्यक्त किया गया है।
पत्थरबाज

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

1
निष्पक्ष होने के लिए, कस्टम रीडर मैक्रो को पंजीकृत करके, लिस्प में वही किया जा सकता है।
फ़जरी

2

लिस्प की कई बोलियाँ हैं, और उनमें से प्रत्येक की अपनी विशेषताएं हैं। मेरी पसंदीदा विशेषता जिसे किसी अन्य भाषा द्वारा अपनाया जाना संभव नहीं है, वह इंटरलेस्प से "स्पेगेटी स्टैक" है ।

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


नहीं पता था कि, इसे बाहर की जाँच करें, आपके उत्तर के लिए धन्यवाद :)
iceX

7
क्या यह स्कीम की निरंतरता के समान है?
निकोला मुसाटी

1
@ नोइकोलामुट्टी, एक "स्पेगेटी स्टैक" योजना-जैसी निरंतरताओं के लिए एक सामान्य कार्यान्वयन रणनीति है (जिसे फ़ंक्शन के बाद कहा जा सकता है जिसने उन्हें वापस लौटाया है)।
एलेक्स डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.