मैक्रोज़ भाषा सुविधाओं तक पहुंच प्रदान करने में आवश्यक हैं। उदाहरण के लिए, TXR Lisp में, मेरे पास एक सीमित फ़ंक्शन कैप्चर करने के लिए sys:capture-cont
नामक एक एकल फ़ंक्शन है। लेकिन यह स्वयं ही उपयोग करने के लिए अजीब है। तो इसके आसपास मैक्रोज़ लपेटे गए हैं, जैसे suspend
, या obtain
and yield
जो पुन: प्रारंभ करने योग्य, निलंबित निष्पादन के लिए वैकल्पिक मॉडल प्रदान करते हैं। उन्हें here लागू किया गया है।
एक और उदाहरण जटिल मैक्रो defstruct
है जो संरचना प्रकार को परिभाषित करने के लिए वाक्यविन्यास प्रदान करता है। यह lambda
-s और अन्य सामग्री जो make-struct-type
फ़ंक्शन को पास किया गया है, में इसके तर्कों को संकलित करता है। कार्यक्रमों OOP संरचनाओं को परिभाषित करने के लिए सीधे make-struct-type
उपयोग किया है, वे बदसूरत होगा:
1> (macroexpand '(defstruct foo bar x y (z 9) (:init (self) (setf self.x 42))))
(sys:make-struct-type 'foo 'bar '()
'(x y z)()
(lambda (#:g0101)
(let ((#:g0102 (struct-type #:g0101)))
(unless (static-slot-p #:g0102 'z)
(slotset #:g0101 'z
9)))
(let ((self #:g0101))
(setf (qref self x)
42)))
())
ओह! उस पर बहुत कुछ चल रहा है। उदाहरण के लिए, हम 9
को स्लॉट z
में स्लॉट नहीं करते हैं क्योंकि (विरासत के कारण) हम वास्तव में व्युत्पन्न संरचना की मूल संरचना हो सकते हैं, और व्युत्पन्न संरचना में, z
एक स्थैतिक स्लॉट (उदाहरणों द्वारा साझा किया जा सकता है) हो सकता है। हम व्युत्पन्न कक्षा में z
के लिए निर्धारित मूल्य को क्लॉबरिंग करेंगे।
एएनएसआई कॉमन लिस्प में, मैक्रो का एक अच्छा उदाहरण loop
है, जो समांतर पुनरावृत्ति के लिए एक संपूर्ण उप-भाषा प्रदान करता है। एक एकल loop
आमंत्रण एक संपूर्ण जटिल एल्गोरिदम व्यक्त कर सकता है।
मैक्रोज़ हमें सिंटैक्स के बारे में स्वतंत्र रूप से सोचने देते हैं जो हम एक भाषा सुविधा में चाहते हैं, और अंतर्निहित कार्यों या इसे लागू करने के लिए आवश्यक विशेष ऑपरेटरों को। इन दोनों में जो भी विकल्प हम करते हैं, मैक्रोज़ उन्हें हमारे लिए पुल करेंगे। मुझे चिंता करने की ज़रूरत नहीं है कि make-struct
उपयोग करने के लिए बदसूरत है, इसलिए मैं तकनीकी पहलुओं पर ध्यान केंद्रित कर सकता हूं; मुझे पता है कि मैक्रो अलग-अलग व्यापार-बंद कैसे बना सकता है इस पर ध्यान दिए बिना। मैंने डिजाइन निर्णय लिया कि सभी संरचना प्रारंभिक प्रकार को पंजीकृत कुछ कार्यों द्वारा किया जा रहा है। ठीक है, इसका मतलब है कि मेरे मैक्रो को स्लॉट-डिफ़ाइनिंग सिंटैक्स में सभी प्रारंभिकताओं को लेना है, और अज्ञात कार्यों को संकलित करना है, जहां स्लॉट प्रारंभिक निकायों को निकायों में उत्पन्न कोड द्वारा किया जाता है।
मैक्रोज़ सिंटैक्स के बिट्स के लिए कंपाइलर हैं, जिसके लिए फ़ंक्शंस और विशेष ऑपरेटर लक्ष्य भाषा हैं।
कभी-कभी लोग (गैर-लिस्प लोग, आमतौर पर) इस तरह से मैक्रोज़ की आलोचना करते हैं: मैक्रोज़ कोई क्षमता नहीं जोड़ता है, केवल सिंटैक्टिक चीनी।
सबसे पहले, सिंटेक्टिक चीनी एक क्षमता है।
दूसरा, आपको "कुल हैकर परिप्रेक्ष्य" से मैक्रोज़ पर भी विचार करना होगा: कार्यान्वयन-स्तर के काम के साथ मैक्रोज़ का संयोजन। यदि मैं लिस्प बोली में सुविधाओं को जोड़ रहा हूं, जैसे ढांचे या निरंतरता, मैं वास्तव में शक्ति का विस्तार कर रहा हूं। उस उद्यम में मैक्रोज़ की भागीदारी आवश्यक है।भले ही मैक्रोज़ स्रोत नई शक्ति के नहीं हैं (यह स्वयं मैक्रोज़ से उत्पन्न नहीं होता है), वे अभिव्यक्ति देते हुए इसे कम करने और उपयोग करने में मदद करते हैं।
यदि आपके पास sys:capture-cont
नहीं है, तो आप suspend
मैक्रो के साथ अपने व्यवहार को केवल हैक नहीं कर सकते हैं। लेकिन अगर आपके पास मैक्रोज़ नहीं है, तो आपको को एक नई सुविधा के लिए पहुंचने के लिए बहुत ही असुविधाजनक करना है जो लाइब्रेरी फ़ंक्शन नहीं है, अर्थात् कुछ नए वाक्यांश संरचना नियमों को एक पार्सर में हार्ड-कोडिंग करना मुश्किल है।
इस प्रश्न में सीडब्लू महसूस होता है इसलिए मैंने इस तरह पोस्ट किया। –
लेकिन मैक्रोज़ के बारे में क्या है जो उन्हें सामान्य कार्यों पर डोमेन-विशिष्ट भाषाओं को लिखने के लिए बेहतर बनाता है? –
जेट्स: आपको एक के लिए सबकुछ के मूल्यांकन में देरी करने के लिए बहुत सारी उद्धरण (स्वीकार्य रूप से संबंधित सुविधा) की आवश्यकता होगी। मैक्रोज़ आपको संकलन-समय पर मनमाने ढंग से चीजें करने के लिए, इससे बचने देते हैं। – Ken