जवाबों:
बाइट-कंपाइलर द्वारा उपलब्ध सभी मैक्रो का संकलन के दौरान विस्तार किया जाता है। "प्राप्य" अनिवार्य रूप से उद्धृत नहीं किया जा रहा है।
defun
S, defmacro
s, lambda
s, का शरीर सभी बाइट-संकलित होता है, जब स्रोत फ़ाइल जिसमें उन्हें बाइट-संकलित किया जाता है। तो हां, उनके अंदर किसी भी मैक्रो का विस्तार किया जाएगा, जब तक कि वे एक उद्धरण ( '
) के अंदर नहीं होते हैं । एक बहुत ही आम गलती रैप करने के लिए है lambda
कि तुम क्यों चाहिए वास्तव में एक बोली में और, अपने बोली कभी नहीं lambda
रों ।
यह मैक्रोज़ के बड़े लाभों में से एक है, जब तक वे अच्छी तरह से लिखे गए हैं, तब तक रनटाइम प्रदर्शन पर उनका कोई प्रभाव नहीं पड़ता है। अन्य लाभ निश्चित रूप से उनकी शक्ति और बहुमुखी प्रतिभा है। नुकसान यह है कि आप वाक्यविन्यास में हेरफेर कर रहे हैं, ऑब्जेक्ट नहीं, इसलिए समस्याओं के लिए बहुत जगह है, कुछ अप्रत्याशित, अन्य अपरिहार्य।
जैसा कि मालाबार ने पहले ही समझाया है, बाइट संकलन के दौरान मैक्रोज़ का विस्तार किया जाता है। यदि कोई फ़ाइल संकलित नहीं की जाती है, तो फ़ाइल लोड होने पर (उत्सुक मैक्रो विस्तार) मैक्रो का विस्तार किया जाता है।
इस पर भरोसा मत करो, यद्यपि। यह बहुत खराब शैली है। आप आमतौर पर उस कोड की उम्मीद नहीं कर सकते हैं जो आपके मैक्रो का उपयोग करता है, वास्तव में संकलित है, और आपको आम तौर पर संकलन के दौरान यथासंभव कम कोड चलाना चाहिए । विशेष रूप से, मैक्रोज़ का उपयोग शायद ही करें और केवल अगर कोई अन्य तरीका नहीं है। अंगूठे के नियम के रूप में, केवल सिंटैक्स के लिए मैक्रोज़ का उपयोग करें , और शब्दार्थ (या कार्यक्षमता) के लिए कभी नहीं ।
मैक्रों एक टपका हुआ अमूर्त है। उनके विस्तार को संकलन समय पर लक्ष्य कोड में हार्ड-कोड किया गया है, और पूर्वव्यापी रूप से नहीं बदला जा सकता है। बाद में लक्ष्य कोड विस्तार के समय मैक्रो के विशिष्ट कार्यान्वयन पर निर्भर करता है । विशेष रूप से, यह मैक्रो बॉडी में उपयोग किए जाने वाले सभी आंतरिक एपीआई पर निर्भर करता है।
नतीजतन, आप इस एपीआई या किसी भी मैक्रो विस्तार पर निर्भर नहीं कर सकते हैं, जो आपके मैक्रो के खिलाफ संकलित किसी भी कोड को तोड़ने के बिना निर्भर करता है।
कार्यक्षमता के लिए मैक्रोज़ का उदार उपयोग निर्भरता नरक की राह को प्रशस्त करता है ।