मैं लिस्प के कुछ हिस्सों के लिए महसूस करने की कोशिश कर रहा हूं कि मैंने अब तक बहुत अधिक उपयोग नहीं किया है। पढ़ें मैक्रोज़ ने इस समय मेरा ध्यान खींचा है। उनके के बारे में बहुत अधिक जानकारी नहीं है का उपयोग करें और इससे यह देखने में मदद मिलेगी कि लोगों ने उनके साथ क्या किया है, दोनों उदाहरण हैं कि वे कैसे काम करते हैं और यह भी देखने के लिए कि किस प्रकार की समस्याओं से संपर्क किया जा सकता है। इसके बाद, क्या पढ़ने के मैक्रोज़ के अच्छे और बुरे उपयोग के बारे में जानने के लिए कोई दिशानिर्देश हैं?मैक्रोज़ पढ़ें: आप उनके लिए क्या उपयोग करते हैं?
उत्तर
एस-एक्सप्रेशन लिस्प डेटा के लिए लिस्प के वाक्यविन्यास हैं। एस-एक्सप्रेशन फ़ंक्शन के साथ पढ़े जाते हैं और पाठक को विस्तारित करने के लिए मैक्रोज़ लिस्प के अंतर्निहित तरीके हैं। इसका मतलब है कि रीड मैक्रोज़ का सबसे प्रत्यक्ष उपयोग प्री-डिफ़ाइंड डेटा सिंटैक्स को लागू करना है और लिस्प एस-एक्सप्रेशन को पढ़ने के तरीके को बदलने या विस्तार करने की संभावनाएं खोलना है।
लिस्प कई डेटा प्रकारों के लिए पूर्व परिभाषित बाह्य वाक्यविन्यास के साथ आता है: प्रतीक, संख्याएं, तार, सरणी, वर्ण, विपक्ष, सूचियां, संरचनाएं और बहुत कुछ। यह डेटा ऑब्जेक्ट्स को मुद्रित करने और वापस पढ़ने की अनुमति देता है।
लिस्प में कई अन्य डेटा प्रकारों के लिए वाक्यविन्यास की कमी है - प्रमुख रूप से हैश टेबल और CLOS ऑब्जेक्ट्स। तो उपयोगकर्ता कोड में पढ़ने मैक्रोज़ का पहला उपयोग पाठक को हैश टेबल, समानांतर वैक्टर, नए नंबर प्रकार, जैसे डेटा संरचनाओं को पढ़ने में सक्षम होना होगा ...मूल रूप से प्रत्येक डेटा प्रकार डेवलपर एक बाहरी वाक्यविन्यास चाहता है जिसे वापस पढ़ा जा सकता है।
चूंकि लिस्प कोड के लिए एस-एक्सप्रेशन का भी उपयोग करता है, इसलिए पढ़ने मैक्रोज़ का दूसरा उपयोग लिस्प प्रोग्राम के लिए नोटेशन का विस्तार करना है। एक विशिष्ट उदाहरण एम्बेडेड एसक्यूएल कोड लिखने के लिए [और] का उपयोग है। सामान्य लिस्प वाक्यविन्यास समान दिखता है, लेकिन [और] का उपयोग SQL अभिव्यक्ति को कोड में खड़े होने में मदद करता है। एक और उदाहरण एम्बेडेड प्रोग्रामिंग भाषाओं जैसे ऑब्जेक्टिव सी स्थिरांक, संदेश इत्यादि के लिए पहचानकर्ता प्रदान करने के लिए पढ़ने मैक्रोज़ का उपयोग करना है। क्लोजर सीएल केस संवेदनशील/केस संरक्षित पहचानकर्ताओं का प्रतिनिधित्व करने के लिए इसका उपयोग करता है और एक इंडेक्स का उपयोग करके पढ़ने के दौरान उनकी परिभाषा को देखने के लिए बाहरी रूप से उपलब्ध पहचानकर्ता।
तीसरा उपयोग लिस्प वाक्यविन्यास में विभिन्न वाक्यविन्यास एम्बेड करना है। इसके लिए एक पुराना उदाहरण इन्फिक्स रीड मैक्रो है, जो एम्बेडेड इंफिक्स अभिव्यक्तियों को अनुमति देता है। अन्य उदाहरण एचटीएमएल या एक्सएमएल सिंटैक्स एम्बेडेड हैं, या अन्य प्रोग्रामिंग भाषा वाक्यविन्यास के एम्बेडेड टुकड़े हैं।
कभी-कभी पढ़ने के लिए मैक्रोज़ का उपयोग अन्य (संबंधित) भाषाओं को लागू करने के लिए किया जाता है जो पूर्व-परिभाषित सामान्य लिस्प वाक्यविन्यास से अलग एस-अभिव्यक्ति वाक्यविन्यास का उपयोग करते हैं। एक उदाहरण स्कीम एस-एक्सप्रेशन के लिए एक पाठक होगा - जो सामान्य लिस्प से थोड़ा अलग है।
हालांकि मैं बहुत सारे मैक्रोज़ का उपयोग करता हूं, मुझे अनौपचारिक प्रयोग के अलावा, रीड-मैक्रोज़ का उपयोग करने की आवश्यकता कभी नहीं मिली है। यदि यह मदद करता है, "लम्बा ओवर लेटडा" पर आपको उनके बारे में व्यापक चर्चा मिलेगी: http://letoverlambda.com/index.cl/toc
मैं वास्तव में उन्हें अपने सामान्य लिस्प कोड के लिए उनसे बचने के लिए प्रवृत्त करता हूं; हाल ही में, मैंने खुद को पाठक-मैक्रोज़ के उपयोग के कारण तीसरे पक्ष की लाइब्रेरी को खारिज कर दिया। यह ज्यादातर इस तथ्य के कारण है कि प्रतीकों के विपरीत, पाठक-मैक्रोज़ के लिए केवल एक ही "नेमस्पेस" है। और जब मैं एक उचित प्रेषण चरित्र चुनते समय अक्सर अपने स्वाद के बारे में पुस्तकालयों के लेखकों से असहमत प्रतीत होता हूं।
हालांकि, मैंने अनुकूलित गैर-मानक रीडटेबल्स + को सरल पार्सिंग कार्यों के लिए सफलतापूर्वक पढ़ा। एक कस्टम रीडटेबल का उपयोग करके अब तक लागू सबसे जटिल पार्सर चीज जेएसपी/एएसपी के समान वाक्यविन्यास के साथ एक HTML टेम्पलेट इंजन (अभी तक एक और, माफ करना) था, लेकिन वास्तविक टेम्पलेट भाषा के रूप में सामान्य लिस्प का उपयोग करना, ताकि आपके पास चीजें हो सकें
<% (for (title . link) in breadcrumb do %><a href="<%= link %>"><%= title %></a><%) %>
(अकेले पठनीय हैक्स के साथ नहीं किया गया था, हालांकि, कोड को प्रीप्रोकैसिंग चरण से गुज़रना पड़ा था)।
रीडर मैक्रोज़ का उपयोग तब किया जाता है जब शाब्दिक वस्तुओं के लिए वाक्यविन्यास होता है जिसे आप चाहते हैं। उनके साथ एक समस्या संभावित वाक्यों के लिए फ्लैट नेमस्पेस है (हालांकि, इसके आसपास काम करने के तरीके हैं)। पाठक मैक्रोज़ के इतने सारे उपयोग नहीं हैं। कुछ उदाहरण है कि मेरे दिमाग में आ रहे हैं:
- http://weitz.de/cl-interpol/ - स्ट्रिंग प्रक्षेप और विस्तारित स्ट्रिंग अंकन
- http://trac.clozure.com/openmcl/wiki/OpenMclFfi के लिए एक वाक्य रचना - एक वाक्य रचना कि सी भाषा (FFI के एक स्वचालित फार्म)
- http://clsql.b9.com/manual/sql.html से प्रतीकों का आयात करता है - एसक्यूएल प्रश्नों के लिए एक वाक्य रचना - बहुत उपयोगी नहीं
- http://www.agentsheets.com/lisp/XMLisp/ - लिस्प कोड में शाब्दिक एक्सएमएल टुकड़े की एम्बेडिंग
एक विशेष रूप से सामान्य और उपयोगी वैकल्पिक वाक्यविन्यास जिसे आप पढ़ सकते हैं मैक्रोज़ के साथ एम्बेड कर सकते हैं regex वाक्यविन्यास है। इसे कार्यान्वित करना मुश्किल नहीं है, क्योंकि यह अलग-अलग भागने वाले नियमों के साथ एक स्ट्रिंग पढ़ रहा है, लेकिन यदि आप अक्सर रेगेक्स का उपयोग करते हैं, तो यह वास्तव में भुगतान कर सकता है। CL-INTERPOL लाइब्रेरी जो dmitry-vk उल्लिखित है, इस कार्यक्षमता को लॉट अन्य सुविधाओं के साथ प्रदान करती है।
मेरे पास गिथब पर दो छोटी परियोजनाएं हैं जो दिखाती हैं कि कैसे और क्यों आम लिस्प में पाठक मैक्रोज़ का उपयोग करना चाहेंगे। ये SHELLSHOCK और BOXEN हैं। जैसा कि अन्य उत्तरों में बताया गया है, CL-INTERPOL एक असाधारण और उपयोगी उदाहरण है।
चाहे ये अच्छे पाठक मैक्रोज़ के उपयोग स्पष्ट रूप से व्यक्तिपरक हैं, लेकिन निश्चित रूप से मुझे लगता है कि वे उपयोगी हैं या मैं कोड नहीं लिखा होता!
मेरे सवाल Writing Common Lisp code that executes from the command line, but not inside the interpreter, जो पाठक मैक्रो की एक आवेदन पत्र है Vsevolod Dyomkin'sanswer देखें।