macros - LISP मैक्रोज़ कितनी दूर जा सकते हैं?




(10)

@sparkes

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

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

विशेष रूप से, क्या मैट्रिक्स का उपयोग करके कोष्ठकों से छुटकारा पा सकता है? मैंने अपने ही माइक्रो-फीचर्स के साथ एमएसीएस को अनुकूलित करने के लिए पर्याप्त (एमएसीएस-) लिस्पा सीखा है, लेकिन मैं बहुत उत्सुक हूं कि भाषा को अनुकूलित करने में मैक्रो कितनी दूर जा सकते हैं।


यदि आप रूबी की तरह दिखने के लिए रूबी चाहते हैं तो रूबी का उपयोग करें

रूबी (और पायथन) का प्रयोग बहुत ही ख़राब तरह से किया जा सकता है जो कि मुख्य कारणों में से एक है, जिससे उन्होंने स्वीकृति को इतनी तेज़ी से प्राप्त कर लिया है।


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

इसलिए, जब आप एक स्रोत फ़ाइल लोड करते हैं, तो आपका लिस्प कंपाइलर टेक्स्ट को पार्स करेगा और एस-एक्सएस का उत्पादन करेगा। मैक्रो इन पर काम करते हैं। यह महान काम करता है और यह s-exps की भावना के भीतर भाषा का विस्तार करने का एक बढ़िया तरीका है

इसके अतिरिक्त, उपरोक्त पार्सिंग प्रक्रिया को "रीडर मैक्रोज़" के माध्यम से बढ़ाया जा सकता है जो आपको अपने कंपाइलर को टेक्स्ट को एस-एक्सएस में बदलने के तरीके को अनुकूलित करने देता है। हालांकि, मैं सुझाव देता हूं कि आप लिस्प की सिंटैक्स को कुछ और में झुकाने के बजाय आलिंगन में ले लें।

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

बीटीडब्ल्यू, जब मैं लिस्प कहते हैं, मेरा मतलब है आम लिस्प

मेरा सुझाव है कि आप अपने पूर्वाग्रहों को दूर रखें और लिस्प को एक ईमानदार जाने दें


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

यह विशेष रूप से सच है यदि आप एक अच्छा संपादक का लाभ उठाते हैं जो इंडेंटेशन और सिंटैक्स रंग (पृष्ठभूमि के समान रंग से कोष्ठक को सेट करने का प्रयास) के साथ मदद करता है।

आप पूरी तरह से भाषा को बदलने और 'रुबी' वाक्यविन्यास प्राप्त करने में सक्षम नहीं हैं, लेकिन आपको इसकी आवश्यकता नहीं है। भाषा लचीलेपन के लिए धन्यवाद, आप एक ऐसी बोली को समाप्त कर सकते हैं जो आपको लगता है कि जैसे आप चाहते हैं कि 'रूबी स्टाइल प्रोग्रामिंग' का पालन कर रहे हों, तो जो भी आपके लिए इसका मतलब होगा।

मुझे पता है यह सिर्फ एक अनुभवजन्य अवलोकन है, लेकिन मुझे लगता है कि मुझे उन लिस्प प्रबुद्धता क्षणों में से एक था जब मुझे यह महसूस हुआ।


हां, आप मूल रूप से वाक्यविन्यास बदल सकते हैं, और यहां तक ​​कि "कोष्ठक नरक" से बच सकते हैं। इसके लिए आपको एक नया रीडर सिंटैक्स परिभाषित करने की आवश्यकता होगी। रीडर मैक्रोज़ में देखें।

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


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

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

सौभाग्य!


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


इस उदाहरण को देखें कि कैसे पाठक मैक्रोज़ लिपि पाठक को जटिल कार्यों जैसे XML टेम्पलेटिंग के साथ बढ़ा सकता है:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

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

अधिक जानकारी यहां उपलब्ध है: http://common-lisp.net/project/cl-quasi-quote/

कॉमन लिस्प वाक्यविन्यास एक्सटेंशन के लिए एक और परियोजना: http://common-lisp.net/project/cl-syntax-sugar/


पैरेन्सिसिस नरक? मैं इसमें और अधिक कोष्ठक नहीं देखता हूं:

(function toto)

तुलना में:

function(toto);

और में

(if tata (toto)
  (titi)
  (tutu))

इससे अधिक नहीं:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

मुझे कम ब्रैकेट और ';' हालांकि।


मैंने कभी देखा है लिस्प मैक्रोज़ का सबसे अच्छा विवरण है

https://www.youtube.com/watch?v=4NO83wZVT0A

करीब 55 मिनट में शुरू होता है। यह "प्रैक्टिकल कॉमन लिस्प" के लेखक पीटर सेबेल द्वारा दिए गए एक बात का एक वीडियो है, जो कि सबसे अच्छा लिस्प टेक्स्टबुक है।

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

आपने पूछा: "क्या आप LISP की कार्यात्मक प्रकृति को अधिक ऑब्जेक्ट ओरिएंटेड सिंटैक्स और सेमेंटिक्स में परिवर्तित कर सकते हैं"। इसका जवाब है हाँ। वास्तव में, लिस्प मूल रूप से कोई ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग नहीं था, आश्चर्य की बात नहीं, क्योंकि लिस्प ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से पहले के आसपास है! लेकिन जब हमने पहली बार 1 9 78 में ओओपी के बारे में सीखा, तो हम इसे लिस्प में आसानी से जोड़ने, अन्य बातों के अलावा, मैक्रोज़ में सक्षम थे। आखिरकार, सामान्य लिस्प ऑब्जेक्ट सिस्टम (सीएलओएस) विकसित किया गया, एक बहुत ही शक्तिशाली ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सिस्टम जो कि लिस्प में सुंदर ढंग से फिट बैठता है। पूरी चीज को विस्तार के रूप में लोड किया जा सकता है - कुछ भी नहीं बनाया गया है! यह सब मैक्रोज़ के साथ किया गया है

लिस्प में एक पूरी तरह से अलग विशेषता है, जिसे "रीडर मैक्रोज़" कहा जाता है, जिसका उपयोग भाषा की सतह सिंटैक्स बढ़ाने के लिए किया जा सकता है। पाठक मैक्रोज़ का उपयोग करके, आप sublanguages ​​बना सकते हैं जिनमें सी-जैसे या रूबी जैसी सिंटैक्स है। वे पाठ को लिस्प में, आंतरिक रूप से रूपांतरित करते हैं इन्हें ज्यादातर वास्तविक लिस्प प्रोग्रामर द्वारा व्यापक रूप से उपयोग नहीं किया जाता है, मुख्यतः क्योंकि ये नए सिंटैक्स को समझने के लिए इंटरैक्टिव डेवलपमेंट पर्यावरण का विस्तार करना कठिन है। उदाहरण के लिए, एमएसीएस इंडेंटेशन कमांड एक नए सिंटैक्स से भ्रमित हो जाएगा। यदि आप ऊर्जावान हैं, हालांकि, एमैक्स भी एक्स्टेंसिबल है, और आप इसे अपने नए लेक्सिकल सिंटैक्स के बारे में सिखा सकते हैं।