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


11

मैंने सुना है कि क्लजोर मैक्रोज़ लिखना आसान है लेकिन रैकेट के हाइजीनिक मैक्रोज़ जितना विश्वसनीय नहीं है। मेरे प्रश्न के 2 भाग हैं:

  1. gensymहाइजीनिक मैक्रो से कैसे अलग है?
  2. रैकेट मैक्रों क्या प्रदान करते हैं कि क्लोजर नहीं है? (यह सुरक्षा, संरचना, या कुछ भी हो)

2
हाइजीनिक मैक्रोज़ मैक्रोज़ हैं जिनके विस्तार की पहचान करने वालों के आकस्मिक कब्जे का कारण नहीं बनने की गारंटी है। हाइजीनिक मैक्रो की शुरूआत से पहले लिस्प समुदाय के भीतर आकस्मिक कब्जा की सामान्य समस्या को अच्छी तरह से जाना जाता था। मैक्रो लेखक भाषा की विशेषताओं का उपयोग करेंगे जो अद्वितीय पहचानकर्ता (उदाहरण के लिए, gensym) उत्पन्न करेंगे या समस्या से बचने के लिए obfuscated पहचानकर्ताओं का उपयोग करेंगे। हाइजीनिक मैक्रो कैप्चर समस्या का एक प्रोग्रामेटिक समाधान है जिसे मैक्रो एक्सपैंडर में ही एकीकृत किया जाता है। en.wikipedia.org/wiki/Hygienic_macro
रॉबर्ट हार्वे

3
क्योंकि [रैकेट] की हाईजेनिक मैक्रो प्रणाली को इस बात का गहरा ज्ञान है कि आपका मैक्रो कैसे काम करता है, आपका मैक्रो पर्यावरण में बहुत अच्छी तरह से एकीकृत होता है: सिंटैक्स हाइलाइटिंग सही ढंग से काम करता है, ऑटोमैटिक वैरिएबल रीनेमिंग सही ढंग से काम करता है, क्रॉस-रेफ़रिंग सही ढंग से काम करता है, और इसलिए अन्य सभी चालाक [रैकेट] आईडीई सुविधाएँ। दूसरे शब्दों में, स्वच्छता आपको केवल साधारण बग जैसे कि वैरिएबल कैप्चर से बचाती नहीं है - यह आपके कोड को औपचारिक रूप से उन उपकरणों द्वारा विश्लेषण करने की अनुमति देता है जो केवल आम LISP के लिए मौजूद नहीं हो सकते। randomhacks.net/2002/09/13/hygienic-macros
रॉबर्ट हार्वे

जवाबों:


6

gensymहाइजीनिक मैक्रोज़ का लाभ भाषा की क्षमता में से एक नहीं है - आप सही समय पर मैक्रोस का उपयोग कर सकते हैं जिसमें अच्छी स्वच्छता का उपयोग करना और सावधानीपूर्वक उद्धरण देना / अनक्वॉट करना शामिल है। हालाँकि, हाइजीनिक मैक्रोज़ सुनिश्चित करते हैं कि आपके मैक्रोज़ में अच्छी हाइजीन हो। उस संबंध में, यह टाइप-चेकिंग जैसा है।

हाइजीनिक मैक्रो को टूलिंग फायदे भी हो सकते हैं। अधिकांश हाइजीनिक मैक्रो सिस्टम आपके मैक्रो को क्या करता है और यह कैसे करता है, इस पर कड़ा नियंत्रण लगाता है (जैसे, आप स्कीम द्वारा syntax-caseविस्तृत किए गए मैक्रो द्वारा निर्धारित किए जाने पर मनमाना कोड निष्पादित नहीं कर सकते हैं )। यह उन प्रोग्रामों को लिखना आसान बना सकता है जो आपके मैक्रो को "समझते" हैं और अतिरिक्त टूलिंग सहायता प्रदान कर सकते हैं।

दूसरी ओर, कुछ मामले हैं जहां अनहेल्दी मैक्रोज़ उपयोगी हो सकते हैं। उदाहरण के लिए, यदि आप वास्तव में एक विशिष्ट चर (जैसे, ऐनाफ़ोरिक मैक्रोज़ ) के लिए एक बंधन पर कब्जा करना चाहते हैं , तो मुझे लगता है कि यदि आप केवल स्वच्छ मैक्रोज़ हैं तो आप भाग्य से बाहर हैं।


2
gensymमैक्रो को मैक्रो उपयोगकर्ता के साथ गलती से मैसेज करने से रोकता है, लेकिन मैक्रो उपयोगकर्ता को मैक्रो के साथ खिलवाड़ करने से नहीं रोकता है। उदाहरण के लिए, एक मैक्रो उपयोगकर्ता को फिर से परिभाषित ifया ऐसा कुछ कर सकता है। (सवाल "कोई भी ऐसा क्यों करेगा" अप्रासंगिक है। यह एक सरल उदाहरण है जो दर्शाता है कि यह संभव है, और यह गैर-स्वच्छ मैक्रोज़ के बारे में तर्क करने के लिए मुश्किल है)
फिल

2
अनहेल्दी मैक्रोज़ निश्चित रूप से उपयोगी हैं। मुझे स्कीम पर यकीन नहीं है, लेकिन रैकेट के पास बहुत सारे "हाइजीन-झुकने" ऑपरेशन हैं। डिफ़ॉल्ट रूप से भाषा के मैक्रो स्वच्छ हैं। जब आप स्वच्छता को तोड़ते हैं तो वे आपको बहुत सचेत करते हैं।
फिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.