2012-05-17 11 views
5

मुझे आश्चर्य है कि एफ # में अवांछित/टाइप किए गए कोड कोटेशन और मैक्रो सिस्टम की स्वच्छता के बीच कोई संबंध है या नहीं। क्या वे एक ही मुद्दे को अपनी संबंधित भाषाओं में हल करते हैं या क्या वे अलग-अलग चिंताओं हैं?क्या एफ # और मैक्रो स्वच्छता में untyped/टाइप कोड कोडेशन के बीच कोई रिश्ता है?

उत्तर

6

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

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

एक तरफ के रूप में, टाइप उद्धरण टेम्पलेट हास्केल quasiquotations के समान दृढ़ता से समान हैं।

लिस्प-जैसी भाषाओं में हाइजेनिक मैक्रोज़ संबंधित हैं, जिसमें वे मेटा प्रोग्रामिंग का समर्थन करने के लिए मौजूद हैं। हालांकि स्वच्छता सरल नाम कैप्चर भ्रम के लिए है, कुछ जो अर्ध उद्धरण टाइप करते हैं, पहले से ही (और अधिक) से बचते हैं।

तो हाँ, वे समान हैं, कि वे क्रमशः टाइप और अनियमित भाषाओं में मेटा प्रोग्रामिंग के लिए तंत्र हैं। टाइप किए गए अर्ध उद्धरण और हाइजेनिक मैक्रोज़ दोनों पूरी तरह से untyped, unsound मेटा प्रोग्रामिंग के लिए अतिरिक्त सुरक्षा जोड़ें। गारंटी के स्तर वे प्रोग्रामर की पेशकश हालांकि अलग है। टाइप किए गए उद्धरण सख्ती से मजबूत हैं।

+3

मैं मानता हूं, हालांकि मुझे लगता है कि मैं इसे अलग-अलग वाक्यांश दूंगा, क्योंकि मुझे लगता है कि स्वच्छता और 'टाइप' यहां ऑर्थोगोनल अवधारणाएं हैं (दोनों अलग-अलग प्रकार की 'सुरक्षा') जोड़ती हैं; मुझे लगता है कि सभी एफ # उद्धरण हाइजेनिक हैं, और कुछ स्थिर (मेटा-) स्थिर टाइपिंग के माध्यम से अतिरिक्त सुरक्षा जोड़ते हैं। – Brian

7

मेटा-प्रोग्रामिंग पहलू एकमात्र समानता है, और यहां तक ​​कि उस संबंध में, एक बड़ा अंतर है। आप मैक्रो के ट्रांसफॉर्मर को सिंटैक्स से सिंटैक्स के फ़ंक्शन के रूप में सोच सकते हैं जैसे कि आप कोटेशन में हेरफेर कर सकते हैं, लेकिन ट्रांसफार्मर वैश्विक रूप से समन्वयित होते हैं ताकि बाइंडर्स के रूप में उपयोग किए जाने वाले नाम एक विशिष्ट प्रोटोकॉल का पालन करें:

1) बाइंडर्स समान नहीं हो सकते मैक्रो में इनपुट में कोई भी मुफ्त नाम (जब तक कि आप एक अस्पष्ट बचपन का उपयोग नहीं करते)

2) मैक्रो के विस्तार में मुक्त मैक्रो परिभाषा के संदर्भ में बंधे नाम मैक्रो उपयोग समय पर एक ही चीज़ को इंगित करना चाहिए। (इसे वैश्विक समन्वय की आवश्यकता है)

नामों के लिए विकल्प बनाए गए हैं ताकि यदि आप गलत नाम का उपयोग करते हैं तो विस्तार विफल नहीं होता है (जब तक कि यह पता न हो कि वह नाम अनबाउंड है)।

टाइप किए गए उद्धरणों के ट्रांसफॉर्मर में यह परिभाषा समय संदर्भ विचार नहीं है। आप एक प्रोग्राम बनाने के लिए कोटेशन में हेरफेर करते हैं जो आपके प्रोग्राम में किसी भी नाम का संदर्भ नहीं देता है। वे एक वाक्य रचनात्मक अमूर्त तंत्र प्रदान करने के लिए नहीं हैं। वाक्यविन्यास के मनमानी आकार? नहीं। यह सब कोर एएसटी आकार होना चाहिए।

टाइप किए गए उद्धरण प्रणाली में खुले कोड को किसी भी संदर्भ के साथ बंद किया जा सकता है जो अपेक्षित संदर्भ की प्रकार संरचना को फिट करता है - एक सुसंगत संरचना में कई खुले घटकों की कोई समन्वित संरचना नहीं है।

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