के साथ नहीं किया जा सकता है, मैं क्लोजर मैक्रोज़ सीख रहा हूं, और आश्चर्य है कि हम मेटाप्रोग्रामिंग के लिए केवल फ़ंक्शंस का उपयोग क्यों नहीं कर सकते हैं।क्लोजर, मैक्रोज़ ऐसा कुछ कर सकता है जो किसी फ़ंक्शन
जहाँ तक मुझे पता के रूप में स्थूल और समारोह के बीच अंतर यह है कि मैक्रो के तर्कों का मूल्यांकन नहीं किया जाता है, लेकिन डाटा संरचनाओं और प्रतीकों के रूप में पारित कर दिया है के रूप में वे कर रहे हैं, जबकि वापसी मान है का मूल्यांकन (जगह है जहाँ मैक्रो कहा जाता है में)। मैक्रो पाठक और मूल्यांकनकर्ता के बीच प्रॉक्सी के रूप में काम करता है, मूल्यांकन के पहले फॉर्म को मनमाने तरीके से बदलता है। आंतरिक रूप से वे सभी भाषा विशेषताओं, कार्यों, विशेष रूपों, शाब्दिक, रिकर्सन, अन्य मैक्रोज़ इत्यादि सहित उपयोग कर सकते हैं
कार्य विपरीत हैं। कॉल से पहले तर्कों का मूल्यांकन किया जाता है, वापसी मूल्य वापसी के बाद नहीं होता है। लेकिन मैक्रोज़ और फ़ंक्शंस की मिररिंग प्रकृति मुझे आश्चर्यचकित करती है, क्या हम मैक्रोज़ का उपयोग अपने तर्क (फॉर्म) को उद्धृत करके, फॉर्म को बदलने, फ़ंक्शन के अंदर मूल्यांकन करने, अंततः इसके मूल्य को वापस कर सकते हैं। क्या यह तर्कसंगत रूप से एक ही परिणाम नहीं देगा? बेशक यह असुविधाजनक होगा, लेकिन सैद्धांतिक रूप से, प्रत्येक संभावित मैक्रो के लिए समकक्ष फ़ंक्शन है?
यहाँ सरल इन्फ़िक्स मैक्रो
(defmacro infix
"translate infix notation to clojure form"
[form]
(list (second form) (first form) (last form)))
(infix (6 + 6)) ;-> 12
यहाँ एक समारोह उपयोग कर रहा है एक ही तर्क
(defn infix-fn
"infix using a function"
[form]
((eval (second form)) (eval (first form)) (eval (last form))))
(infix-fn '(6 + 6)) ;-> 12
अब है, इस धारणा सभी स्थितियों के लिए generalizable है, या फिर कुछ कोने मामलों में जहां मैक्रो सका हैं ' बाहर नहीं किया जा सकता है? अंत में, मैक्रोज़ फ़ंक्शन कॉल पर केवल एक वाक्य रचनात्मक चीनी हैं?
ध्यान दें कि मैक्रोज़ को समय-समय पर मैक्रोएक्सप्शन-टाइम (आमतौर पर संकलन से पहले) के दौरान विस्तारित किया जाता है। संकलित कोड ऐसा होगा जैसे आपने हाथ से विस्तार लिखा था, इसलिए इसके लिए कोई प्रदर्शन दंड नहीं है। यह भी याद रखें कि 'eval' एक शून्य व्याख्यात्मक वातावरण में रूप का मूल्यांकन करता है। '(चलो [x 10] (infix-fn '(x + 6)))' => 'कंपाइलर अपवाद ... प्रतीक को हल करने में असमर्थ: x' – jkiiski
ये अच्छे अंक हैं जिन्हें मैंने –