जैसा कि टॉमस कहते हैं, यह सैद्धांतिक रूप से सरल है कि इस तरह की सुविधा किसी भी स्थैतिक रूप से टाइप की गई भाषा (हालांकि अभी भी बहुत सी चीजें हैं) में जोड़ने के लिए सरल है।
मैं मेटा प्रोग्रामिंग विशेषज्ञ नहीं हूं, लेकिन @ एसके-लॉजिक पूछता है कि क्यों एक सामान्य संकलन-समय मेटा प्रोग्रामिंग सिस्टम नहीं है, और मैं जवाब देने का प्रयास करूंगा। मुझे नहीं लगता कि आप मेटा-प्रोग्रामिंग का उपयोग करके एफ # प्रकार प्रदाताओं के साथ आसानी से प्राप्त कर सकते हैं, क्योंकि एफ # प्रकार प्रदाता डिजाइन-समय पर आलसी और गतिशील रूप से इंटरैक्टिव हो सकते हैं। आइए एक उदाहरण दें कि डॉन के पिछले वीडियो में से एक में डेमो-एड है: Freebase टाइप प्रदाता। फ्रीबेस एक स्कीमेटेड, प्रोग्राम करने योग्य विकिपीडिया की तरह है, इसमें सबकुछ पर डेटा है। तो अगर आप की तर्ज पर कोड लिखने खत्म कर सकते हैं
for e in Freebase.Science.``Chemical Elements`` do
printfn "%d: %s - %s" e.``Atomic number`` e.Name e.Discoverer.Name
या whatnot (मैं सटीक कोड बेतकल्लुफ़ की जरूरत नहीं है), लेकिन बस के रूप में आसानी से कोड है कि बेसबॉल के आँकड़े के बारे में जानकारी हो जाता है, या लिखने प्रसिद्ध अभिनेता है जब दवा पुनर्वसन सुविधाओं में, या फ्रीबेज के माध्यम से उपलब्ध एक अन्य प्रकार की जानकारी में किया गया है।
कार्यान्वयन बिंदु-दृश्य से, यह सभी फ्रीबेस के लिए स्कीमा उत्पन्न करने और इसे .NET a-prei में लाने के लिए अक्षम है; आप बस इसे सेट अप करने के लिए शुरुआत में एक संकलन-समय कदम नहीं उठा सकते हैं। आप छोटे डेटा स्रोतों के लिए ऐसा कर सकते हैं, और वास्तव में कई अन्य प्रकार के प्रदाता इस रणनीति का उपयोग करते हैं, उदा। एक SQL प्रकार प्रदाता डेटाबेस पर इंगित करता है, और उस डेटाबेस में सभी प्रकार के लिए .NET प्रकार उत्पन्न करता है। लेकिन यह रणनीति फ्रीबेज जैसे बड़े क्लाउड डेटा स्टोर के लिए काम नहीं करती है, क्योंकि बहुत से पारस्परिक प्रकार हैं (यदि आपने फ्रीबेज के लिए .NET मेटाडेटा उत्पन्न करने का प्रयास किया है, तो आप पाएंगे कि लाखों प्रकार हैं (जिनमें से ChemicalElement
AtomicNumber
और Discoverer
और Name
और कई अन्य फ़ील्ड हैं, लेकिन सचमुच ऐसे लाखों प्रकार हैं) जिन्हें आपको 32-बिट .NET प्रक्रिया में उपलब्ध होने की तुलना में अधिक स्मृति की आवश्यकता है, केवल पूरे प्रकार की स्कीमा का प्रतिनिधित्व करने के लिए।
तो एफ # टाइप-प्रदाता रणनीति एक एपीआई आर्किटेक्चर है जो टाइप प्रदाताओं को ऑन-डिमांड की जानकारी प्रदान करने की अनुमति देती है, जो आईडीई के भीतर डिज़ाइन-टाइम पर चलती है। जब तक आप टाइप न करें Freebase.Science.
, प्रकार प्रदाता को विज्ञान श्रेणियों के तहत इकाइयों के बारे में जानने की आवश्यकता नहीं है, लेकिन एक बार जब आप .
Science
के बाद दबाते हैं, तो प्रकार प्रदाता जा सकता है और संपूर्ण स्कीमा का एक और स्तर सीखने के लिए एपीआई से पूछ सकता है जानें कि विज्ञान के अंतर्गत कौन सी श्रेणियां मौजूद हैं, जिनमें से एक ChemicalElements
है। और फिर जब आप उनमें से किसी एक को "डॉट" करने का प्रयास करते हैं, तो यह पता लगाएगा कि तत्वों पर परमाणु संख्याएं हैं और क्या नहीं। तो टाइप प्रदाता समय-समय पर उस समय संपादक को टाइप करने के लिए सटीक कोड से निपटने के लिए पूरी तरह से स्कीमा को पर्याप्त रूप से प्राप्त करता है। नतीजतन, उपयोगकर्ता को अभी भी जानकारी के ब्रह्मांड के किसी भी हिस्से का पता लगाने की आजादी है, लेकिन किसी भी एक स्रोत कोड फ़ाइल या इंटरैक्टिव सत्र केवल उपलब्ध होने के एक छोटे से अंश का पता लगाएगा। जब संकलन/कोडेजन का समय आता है, तो कंपाइलर को केवल उस डेटा को वास्तव में उपयोग करने के लिए पर्याप्त कोड उत्पन्न करने की आवश्यकता होती है, जिसे उपयोगकर्ता ने वास्तव में अपने कोड में उपयोग किया है, संभावित डेटाटाइम बिट्स की बजाय पूरे डेटा स्टोर से बात करने की संभावना है।
(हो सकता है कि आपको लगता है कि अब आज के मेटा प्रोग्रामिंग सुविधाओं में से कुछ के साथ, मैं नहीं जानता कि क्या कर सकते हैं, लेकिन लोगों के बारे में मैं स्कूल में एक लंबा वापस आसानी से इस संभाला नहीं हो सकता था, जबकि सीखा है।)
यह है कि चीजें इस तरह लागू करने के लिए आसान बना देता है भाषा सुविधाओं के बारे में पूछने के लिए और अधिक दिलचस्प हो जाएगा। और जवाब है: संकलन समय मेटाप्रोग्रामिंग (जैसा कि लिस्प, मेटाकैमल, नेमेरले, टेम्पलेट हास्केल इत्यादि में)। मुझे आश्चर्य है कि उन्होंने एक सामान्य जेनेरिक समाधान की अनुमति देने के बजाय, एफ प्रदाता में एक प्रवीणक के रूप में टाइप प्रदाताओं को क्यों लागू किया है। और यह मेटाप्रोग्रामिंग चीज ओओ, कार्यात्मक, अनिवार्य, पूरी तरह से ऑर्थोगोनल है, आप किसी भी संभावित भाषा के साथ इस खेल को खेल सकते हैं। –
@ एसके-तर्क - मुझे लगता है कि टाइप प्रदाताओं _are_ संकलन समय मेटाप्रोग्रामिंग का एक रूप है। इसके अलावा, "अधिक सामान्य" समाधान जो आप प्रशंसा करते हैं, उनके पास ट्रेडऑफ का अपना सेट भी है। उदाहरण के लिए, मेटाओकैमल स्टेजिंग के विचार को शुरू करके टाइप सिस्टम को अधिक जटिल बनाता है (और जहां तक मुझे पता है कि उद्धरण/विभाजन/केवल अभिव्यक्तियों को चलाने की अनुमति है, परिभाषाओं को टाइप नहीं करते हैं)। – kvb
@ केवीबी, हां, वे वास्तव में संकलन समय मेटाप्रोग्रामिंग का एक रूप हैं। लेकिन मैं इसके विभिन्न विशिष्ट "रूपों" के समूह के बजाय एक पूर्ण उड़ा जेनेरिक मेटाप्रोग्रामिंग करना पसंद करूंगा। और, हां, मेटाकामल आदर्श नहीं है - वही काम करने के तरीके बहुत आसान हैं। –