2017-05-22 17 views
5

मैं क्लोजर के लिए अपेक्षाकृत नया हूं और रीडर मैक्रोज़ और नियमित मैक्रोज़ के बीच अंतर के बीच मेरे दिमाग को काफी लपेट नहीं सकता, और अंतर महत्वपूर्ण क्यों है।"नियमित" और "पाठक" मैक्रोज़ के बीच क्या अंतर है?

आप किस परिस्थिति में एक दूसरे का उपयोग करेंगे और क्यों?

उत्तर

5

रीडर मैक्रो भाषा की वाक्य रचना को बदलने तरीके कि सामान्य मैक्रो नहीं (एक सामान्य मैक्रो नहीं कोष्ठकों से छुटकारा पाने में सक्षम होगा कर सकते हैं (उदाहरण के लिए, @foo(deref foo) में बदल जाता है), तो आप चाहते हैं (@ foo) जैसे कुछ करने के लिए)। इसे रीडर मैक्रो कहा जाता है, क्योंकि इसे प्रतिलिपि के read पास में लागू किया गया है (source देखें)।

क्लोजर डेवलपर के रूप में, आप केवल नियमित मैक्रोज़ बनाएंगे, लेकिन आप पर्याप्त रूप से उन पर विचार किए बिना, पाठक मैक्रोज़ का उपयोग करेंगे।

पाठक मैक्रोज़ की पूरी सूची यहां है: https://clojure.org/reference/reader और इसमें @', और #{} जैसी सामान्य चीज़ें शामिल हैं।

Clojure (कुछ अन्य lisps के विपरीत) उपयोगकर्ता परिभाषित पाठक मैक्रो का समर्थन नहीं करता है, लेकिन वहाँ कुछ tagged literals (#inst जैसे या #uuid)

3

tl के माध्यम से पाठक में निर्मित तानाना है, डॉ *

मैक्रोज़ [सामान्य मैक्रोज़] मूल्यांकन (आरपीएल के ई) के दौरान विस्तारित होते हैं, प्रतीकों से बंधे होते हैं, लिस्प ऑब्जेक्ट्स पर काम करते हैं, और पहले में दिखाई देते हैं, या "फ़ंक्शन", एक रूप का हिस्सा होते हैं। क्लोजर, और सभी लिस्प्स, नए मैक्रोज़ को परिभाषित करने की अनुमति देते हैं।

रीडर मैक्रोज़ पढ़ने के दौरान, मूल्यांकन से पहले, एक वर्ण स्ट्रिंग पर काम करते हैं, पाठक से उत्सर्जित होने वाली सभी लिस्प ऑब्जेक्ट्स से पहले, और पहले में होने के लिए प्रतिबंधित नहीं होते हैं, या "फ़ंक्शन" , एक रूप का हिस्सा। क्लोजर, कुछ अन्य लिस्प्स के विपरीत, क्लोजर कंपाइलर को संपादित करने से कम, नए पाठक मैक्रोज़ को परिभाषित करने की अनुमति नहीं देता है।

अधिक शब्दों:

सामान्य गैर पाठक मैक्रो, या सिर्फ "मैक्रो", तुतलाना वस्तुओं पर कार्य करते हैं। पर विचार करें:

(and 1 b :x)

and मैक्रो, दो मूल्यों के साथ बुलाया जाएगा एक मूल्य 1 है और अन्य प्रतीक b (नहीं ख का मूल्य) और कीवर्ड :x से मिलकर एक सूची है। and मैक्रो सब कुछ पहले से ही एक लिस्प (क्लोजर) मान से निपट रहा है।

मैक्रो विस्तार केवल तब होता है जब मैक्रो सूची की शुरुआत में होता है। (and 1 2)and मैक्रो फैलाता है। (list and) एक त्रुटि देता है, "मैक्रो का मूल्य नहीं ले सकता"

पाठक इन क्लोजर में एक वर्ण स्ट्रिंग को बदलने के लिए रीस्पॉन्सिबल है एक पाठक मैक्रो एक ऐसा वर्ण है जो पाठक को बदलने के लिए जिम्मेदार भाग को बदलता है लिस्प ऑब्जेक्ट्स में टेक्स्ट स्ट्रीम, संचालित करता है।क्लोजर के लिस्पी रीडर के लिए प्रेषण LispReader.java में है। जैसा कि अलेजैंड्रो सी द्वारा बताया गया है, क्लोजर रीडर मैक्रोज़ जोड़ने का समर्थन नहीं करता है।

रीडर मैक्रोज़ एक वर्ण हैं। (मुझे नहीं पता कि यह सभी लिस्प्स के लिए सच है, लेकिन क्लोजर का वर्तमान कार्यान्वयन केवल एकल वर्ण पाठक मैक्रोज़ का समर्थन करता है।)

रीडर मैक्रोज़ फॉर्म में किसी भी बिंदु पर मौजूद हो सकते हैं। (conj [] 'a) पर विचार करें यदि ' मैक्रो सामान्य थे, तो टिक को एक लिस्प ऑब्जेक्ट बनने की आवश्यकता होगी ताकि कोड conj, एक खाली वेक्टर, प्रतीक ' और आखिरकार a प्रतीक की सूची हो। लेकिन अब विकास नियमों की आवश्यकता होगी कि ' का मूल्यांकन स्वयं ही किया जाए। इसके बजाय पाठक, ' को देखकर पूर्ण एस-एक्सप को quote के साथ चलाता है ताकि मूल्यांकनकर्ता को लौटाया गया मूल्य conj, एक खाली वेक्टर, और quote की सूची a की सूची हो। अब quote एक सूची का प्रमुख है और यह उद्धरण के लिए मूल्यांकन नियम बदल सकता है।

1

शीघ्र ही बात करते हुए, एक पाठक मैक्रोज़ निम्न-स्तरीय सुविधा है। यही कारण है कि उनमें से बहुत कम हैं (केवल @, उद्धरण और थोड़ा और)। कई पाठक नियमों को रखने से किसी भी भाषा को गड़बड़ में बदल दिया जाएगा।

एक नियमित मैक्रो एक उपकरण है जिसका व्यापक रूप से क्लोजर में उपयोग किया जाता है। एक डेवलपर के रूप में, यदि आप कोर क्लोजर डेवलपर नहीं हैं तो अपने स्वयं के नियमित मैक्रोज़ लिखने के लिए आपका स्वागत है लेकिन पाठक नहीं।

आप हमेशा अपने टैग किए गए अक्षर का उपयोग पाठक नियमों के प्रतिस्थापन के रूप में कर सकते हैं, उदाहरण के लिए #inst "2017" आपको Date उदाहरण और आगे प्रदान करेगा।

संबंधित मुद्दे