लिस्प मैक्रो के विशिष्ट अनुप्रयोग क्या हैं?


19

मैं कुछ LISP सीखने की कोशिश कर रहा हूं और मैंने LISP मैक्रोज़ के महत्व के बारे में बहुत कुछ पढ़ा है इसलिए मैं उनके साथ कुछ काम करने का अनुभव प्राप्त करना चाहूंगा।

क्या आप एक व्यावहारिक अनुप्रयोग क्षेत्र सुझा सकते हैं जो मुझे वास्तविक दुनिया की समस्या को हल करने के लिए मैक्रोज़ का उपयोग करने की अनुमति देगा, और इस प्रोग्रामिंग निर्माण की उपयोगिता को समझने के लिए?

ध्यान दें

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


जवाबों:


9

लिस्प मैक्रोज़ कुछ अलग गुणों को मिलाते हैं:

  1. मैक्रोज़ नए सिंटैक्स को परिभाषित करते हैं ax वे इनपुट के रूप में स्रोत-कोड का उपयोग करते हैं
  2. मैक्रोज़ आमतौर पर संकलन-समय पर चलाए जाते हैं
  3. मैक्रोज़ स्रोत-कोड उत्पन्न करते हैं

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

एक और बढ़िया उदाहरण प्रैक्टिकल कॉमन लिस्प , प्रैक्टिकल: पार्सिंग बाइनरी फाइल्स में बाइनरी सीरियलाइजेशन चैप्टर है ।

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


मैंने सिर्फ "प्रैक्टिकल कॉमन लिस्प" पुस्तक खरीदी है, मैं आपके द्वारा सुझाए गए उदाहरण पर एक नज़र डालूंगा।
जियोर्जियो

2

जिस तरह से मैं आम लिस्प में मैक्रोज़ के बारे में सोचना पसंद करता हूं, वह यह है कि वे फ़ंक्शन हैं जिनका कोड का मूल्यांकन किया जाना है, लेकिन उस कोड को वापस करने से पहले उनके तर्कों का मूल्यांकन नहीं करते हैं। फ़ंक्शंस कुछ भी लौटाते हैं, लेकिन वे अपने शरीर का मूल्यांकन करने से पहले प्रत्येक तर्क का मूल्यांकन करते हैं। मैक्रों नहीं करते।

'ऑन लिस्प' में पॉल ग्राहम मैक्रोज़ और फ़ंक्शंस के बीच के अंतर का सबसे अच्छा वर्णन प्रदान करता है, और उनकी ओवरलैप और विशिष्टता पर चर्चा करता है। कोड के कई बिट्स को एक फ़ंक्शन या मैक्रो के रूप में लिखा जा सकता है, लेकिन ऐसे मामले हैं जहां केवल एक मैक्रो काम करेगा। एक बार जब आप इस के चारों ओर अपना सिर लपेटते हैं, तो मुझे लगता है कि आपको लिस्प में मैक्रोज़ का उपहार मिला है।

एक मैक्रो के उदाहरण के रूप में जहां एक फ़ंक्शन काम नहीं करेगा, 'एआईएफ' (यदि एनाफ़ोरिक यदि) देखें। यह कोड की सिर्फ कुछ पंक्तियाँ हैं, और मेरी सिफारिश कहाँ से शुरू करनी है।

और अगर, कि जानबूझकर चर कब्जा का लाभ उठाता है, तो सामान्य लिफ़्फ़ के अनहोनी संस्करण का संदर्भ दें। योजना का स्वतः-हाइजेनिक संस्करण IMO 'वास्तविक सौदा' नहीं है। चर कैप्चर लिस्प मैक्रोोलॉजी का एक महत्वपूर्ण हिस्सा है, और कुछ अधिक शक्तिशाली और उपयोगी मैक्रोज़ निश्चित रूप से इसका लाभ उठाते हैं।

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