डी

2010-09-10 10 views
10

में संकलन समय कोड जनरेशन मैं वर्तमान में डी सीख रहा हूं, और जिन चीज़ों के बारे में मैंने सोचा है उनमें से एक यह है कि क्या डी के पास जेवीएम भाषाओं की कोड जनरेशन क्षमताओं को डुप्लिकेट करने का एक तरीका है।डी

यहां एक परिदृश्य है: मेरे पास एक ऑब्जेक्ट है, और मैं उस ऑब्जेक्ट के आधार पर एक स्ट्रिंग जेनरेट करना चाहता हूं जो इसका नाम और उसके सभी फ़ील्ड देता है। जावा/स्कैला में, मैं केवल प्रतिबिंब का उपयोग कर सकता हूं, लेकिन मान लीजिए गति एक मुद्दा है। मैं एक बाइटकोड पीढ़ी लाइब्रेरी का उपयोग गतिशील रूप से उत्पन्न करने और संकलित करने के लिए कर सकता हूं जो प्रतिबिंब के बिना करता है। कार्यान्वयन ऑब्जेक्ट के फ़ील्ड के माध्यम से पुनरावृत्ति करने और रिकर्सन के माध्यम से इसका नाम प्राप्त करने के लिए टूट जाएगा, और उस जानकारी का उपयोग गतिशील रूप से जावा (या बाइटकोड) उत्पन्न करने के लिए करेगा जो फ़ील्ड को सीधे एक्सेस करता है।

यदि आपको वह परिदृश्य पसंद नहीं है क्योंकि यह कमजोर और/या अवास्तविक है, तो दूसरा यथार्थवादी हो सकता है, ऑब्जेक्ट क्रमबद्धता अनुकूलित किया गया है।

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

उत्तर

5

स्ट्रिंग मिश्रक उन नामस्थानों तक पहुंच सकते हैं जिन्हें वे मिश्रित कर रहे हैं। इसमें this.tupleof शामिल है, जिसका उपयोग कक्षा के क्षेत्रों को पुन: सक्रिय करने के लिए किया जा सकता है। एक क्रमबद्धता टेम्पलेट इसका लाभ उठा सकता है, या अन्यथा उपयोगकर्ता को हाथ से क्रमबद्ध करने के लिए फ़ील्ड निर्दिष्ट करने के लिए मजबूर करता है; अर्थात। class Class : ISerializable { int foo; Forble bar; mixin(genSerialize("foo, bar")); ... }

6

न केवल यह किया जा सकता है, यह आपके लिए व्यावहारिक रूप से डी 2 में किया जाता है। इन सभी को संकलित समय सुविधाओं को रनटाइम सुविधाओं में बदलने के लिए आपको केवल एक छोटा मिश्रण चाहिए।

  • वर्ग के नाम के लिए, तुम सब करने की जरूरत है वर्ग की गुंजाइश अंदर typeof(this).stringof का मूल्यांकन है।

  • सभी फ़ील्ड की एक सूची के लिए, __traits(allMembers, typeof(this)) आज़माएं और फिर उस फ़ील्ड को फ़िल्टर करें जो फ़ील्ड नहीं है (std.traits यहां उपयोगी होगा)।

+0

कृपया, क्या आप इस [पोस्ट] (http://stackoverflow.com/questions/11314596/listing-a-classs-methods-trough-mixin) पर विचार कर सकते हैं? – menjaraz