फ़ाइल संकलित होने पर मैक्रो का विस्तार किया जाता है?


13

मेरे पास एक मैक्रो है जिसे इसके उपयोग संकलन-समय के हर एक उदाहरण पर विस्तारित करने की आवश्यकता है। क्या कोई ऐसा तरीका है जिसे मैं कोडबेस के माध्यम से जाने और प्रत्येक कॉल को सावधानीपूर्वक लपेटने के बिना इसे निर्दिष्ट कर सकता हूं eval-when-compile?

जवाबों:


13

बाइट-कंपाइलर द्वारा उपलब्ध सभी मैक्रो का संकलन के दौरान विस्तार किया जाता है। "प्राप्य" अनिवार्य रूप से उद्धृत नहीं किया जा रहा है।

defunS, defmacros, lambdas, का शरीर सभी बाइट-संकलित होता है, जब स्रोत फ़ाइल जिसमें उन्हें बाइट-संकलित किया जाता है। तो हां, उनके अंदर किसी भी मैक्रो का विस्तार किया जाएगा, जब तक कि वे एक उद्धरण ( ') के अंदर नहीं होते हैं । एक बहुत ही आम गलती रैप करने के लिए है lambdaकि तुम क्यों चाहिए वास्तव में एक बोली में और, अपने बोली कभी नहीं lambdaरों

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


7

जैसा कि मालाबार ने पहले ही समझाया है, बाइट संकलन के दौरान मैक्रोज़ का विस्तार किया जाता है। यदि कोई फ़ाइल संकलित नहीं की जाती है, तो फ़ाइल लोड होने पर (उत्सुक मैक्रो विस्तार) मैक्रो का विस्तार किया जाता है।

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

मैक्रों एक टपका हुआ अमूर्त है। उनके विस्तार को संकलन समय पर लक्ष्य कोड में हार्ड-कोड किया गया है, और पूर्वव्यापी रूप से नहीं बदला जा सकता है। बाद में लक्ष्य कोड विस्तार के समय मैक्रो के विशिष्ट कार्यान्वयन पर निर्भर करता है । विशेष रूप से, यह मैक्रो बॉडी में उपयोग किए जाने वाले सभी आंतरिक एपीआई पर निर्भर करता है।

नतीजतन, आप इस एपीआई या किसी भी मैक्रो विस्तार पर निर्भर नहीं कर सकते हैं, जो आपके मैक्रो के खिलाफ संकलित किसी भी कोड को तोड़ने के बिना निर्भर करता है।

कार्यक्षमता के लिए मैक्रोज़ का उदार उपयोग निर्भरता नरक की राह को प्रशस्त करता है


मैक्रोज़ लिखते या उपयोग करते समय बहुत अच्छे बिंदुओं को ध्यान में रखा जाना चाहिए।
सीन एलेड

"कार्यक्षमता के लिए मैक्रो का उदार उपयोग निर्भरता नरक के लिए मार्ग को प्रशस्त करता है।" एक हफ्ते पहले तक, package.el के पास एक बग था जिसने पूरी तरह से वैध मैक्रो निर्भरता स्थितियों के तहत पैकेज की स्थापना को पूरी तरह से तोड़ दिया था।
मालाबार

@ मलबर्बा विवरण प्रदान करने के लिए देखभाल?
चंद्रग्रहण

@lunaryorn यहाँ तुम जाओ । बुरा थोड़ा मुद्दा।
मालाबार

1
@lunaryorn मैं सहमत हूं कि मैक्रोज़ खतरनाक हैं (मैं अपने जवाब को कम ध्वनि की प्रशंसा करने के लिए संपादित करूंगा), लेकिन मुझे नहीं लगता कि बग इसका एक विशिष्ट उदाहरण था। उस बग में अन्य (कम उत्तेजित) अभिव्यक्तियाँ थीं जो मैक्रोज़ को बिल्कुल भी शामिल नहीं करती हैं। यह फ़ंक्शन निर्भरता के साथ समस्याओं का कारण भी बना।
मालाबार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.