2008-10-29 7 views
22

सबसे अच्छा कुछ हद तक व्यावहारिक मेटाप्रोग्रामिंग हैक आपने डी प्रोग्रामिंग भाषा में किया या देखा है? कुछ हद तक व्यावहारिक साधनों को छोड़कर, उदाहरण के लिए, संकलन-समय रेएट्रैसर।डी टेम्पलेट्स: कूलस्ट हैक

उत्तर

8

एकमुश्त सबसे अच्छे के संदर्भ में, मैं होगा किर्क मैकडॉनल्ड्स के PyD (और अन्य समान बाइंडिंग) कहने के लिए, क्योंकि इन्हें विभिन्न प्रकार के साथ-साथ जटिल कोड पीढ़ी का पता लगाने और संभालने में बड़ी मात्रा में काम करना पड़ता है।

उस ने कहा, पीईडी केवल जीतता है क्योंकि BLADE तकनीकी रूप से सीटीएफई का उपयोग करता है, टेम्पलेट नहीं।

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

7

D/Objective-C Bridge का उपयोग करता है टेम्पलेट्स आप डी में कोको वस्तुओं में हेरफेर

Scrapple उपकरण में
8

DParse एक टेम्प्लेटेड पार्सर जेनरेटर है यह बताने के लिए। हालांकि, एलडीसी एक कार्यात्मक संकलन समय जीसी के साथ एकमात्र डी संकलक है (लेकिन तब भी इसमें कुछ अजीब यादृच्छिक दुर्घटनाएं होती हैं)। Ive इसके साथ थोड़ा खेला और आप कुछ दिलचस्प चीजें जैसे कॉन्फ़िगरेशन फ़ाइल पार्सिंग और सामान कर सकते हैं, लेकिन एक संकलन समय तक जीसी पूरी तरह से चल रहा है, आप बड़ी चीजें नहीं कर सकते हैं।

+5

इसे एक डी आकार का व्याकरण (~ 200 प्रोडक्शंस) "खिला रहा है" केवल "7 मिनट और 700 एमबी संकलन करने के लिए लेता है। (पूर्ण प्रकटीकरण, मैंने dparse लिखा) – BCS

6

मेरे पसंदीदा tools.base से ElemType और KeyType होगा:

template ElemType(T) { 
    alias typeof((function() { 
    foreach (elem; Init!(T)) return elem; assert(false); 
    })()) ElemType; 
} 

template KeyType(T) { 
    alias typeof((function() { 
    foreach (key, elem; Init!(T)) return key; assert(false); 
    })()) KeyType; 
} 
6

Compile time string hashing। आप इसका उपयोग अपने कोड में एम्बेडेड स्ट्रिंग को खराब करने के लिए कर सकते हैं। बस "हैश" के लिए खोजें। उस पृष्ठ पर भी कुछ अन्य दिलचस्प नमूने भी।

6

एक united type template struct (यह अभ्यस्त आप इकाई त्रुटियों बनाने के लिए अनुमति देते हैं।)

9

An arbitrary precision type यह संकलन समय पर एएसएम कोड उत्पन्न करता है (इससे पहले कि संकलक करता है)

5

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

4

मैं एक memoize() फ़ंक्शन जिसका हैडर यह है (कोड थोड़ा यहाँ चिपकाने के लिए लंबा है) ने लिखा:

ऑटो memoize (TFunc) (TFunc समारोह);

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

यूआईटी फिब (uint n) {वापसी n> 0? एन> 1?ज्ञापन (& फिब) (एन -1) + ज्ञापन (& फिब) (एन -2): 1: 0; }

आप इसे सामान्य रूप से कॉल कर सकते हैं, जैसे: fib (1000);


संपादित करें: पिछले कोड जिसका लिंक मैं पोस्ट नहीं बल्कि घृणित था, this version is much more elegant

+1

कोड को जिथब पर पोस्ट करें और इसे साझा करें। अच्छा, अगर आप चाहते हैं। –

+2

सुझाव के लिए धन्यवाद! हाँ, मैं इसे साझा करना चाहता हूं। :) मैंने साइट के बारे में कभी नहीं सुना होगा, लेकिन मैंने अभी साइन अप किया है। मैं थोड़ा उलझन में हूं कि यह कैसे काम करता है, हालांकि ... क्या मुझे एक महत्वपूर्ण जोड़ी और सब कुछ बनाने की ज़रूरत है? या मैं साइट के एक असंबंधित हिस्से पर हूँ? – Mehrdad

+1

यदि आप अपने खुद के रेपो पर कोई काम करना चाहते हैं तो आपको एक महत्वपूर्ण जोड़ी की आवश्यकता होगी (मैं इसका सुझाव देता हूं)। लेकिन आप आसानी से एक गिस्ट भी बना सकते हैं: https://gist.github.com/ –

6

एक उदाहरण डी 12 मानक पुस्तकालय में bitfields सुविधा है जो उपयोगकर्ता द्वारा निर्दिष्ट लेआउट से शुरू होने वाले बिट फ़ील्ड मैनिपुलेशन के लिए कोड उत्पन्न करता है।

Tuple facility एक और उदाहरण है। यह उपयोगकर्ता द्वारा प्रदत्त प्रकारों और वैकल्पिक नामों के आधार पर एक ट्यूपल उत्पन्न करता है। वहां नामित क्षेत्रों को इंजेक्शन देने के लिए वहां बहुत से जनरेटिव उम्फ नहीं हैं, लेकिन मुझे लगता है कि यह एक उदाहरण उदाहरण है।

लैम्बर्ट के के बिना जाने का फायदा उठाने मैं सिर्फ मानक पुस्तकालय के लिए memoize जोड़ा - संबंधित समाचार समूह चर्चा के लिए कोड के लिए प्रलेखन के लिए here, here, और here देखते हैं।

एक और सुविधा जिस पर मैंने काम किया है वह एक उच्च-क्रम कार्य है जो एक अभिन्न या वास्तविक मूल्यवान फ़ंक्शन को सारणीबद्ध करता है (उदा। तेजी से घातीय) प्रदान करता है। यह अभी तक रिलीज के लिए तैयार नहीं है।

संकलन के दौरान वस्तु निर्माण की अनुमति दी जाएगी, तो इसे बनाना आसान होगा। नियमित अभिव्यक्ति इंजन जो संकलन के दौरान सभी ऑटोमाटा पीढ़ी करते हैं।

2

mixins को पढ़ने के लिए और एक Stream वस्तु से आसान संरचनाओं लिखें:

template TStructReader() { 
     private alias typeof(*this) T; 
     static T opCall(Stream stream) { 
       assert(stream.readable); 
       T ret; stream.readExact(&ret, T.sizeof); 
       return ret; 
     } 
} 

template TStructWriter() { 
     private alias typeof(*this) T; 
     void write(Stream stream) { 
       assert(stream.writeable); 
       stream.writeExact(this, T.sizeof); 
     } 
} 

इस तरह यह प्रयोग करें:

align (1) struct MyStruct { 
     ... definitions here ... 
     mixin TStructReader; 
     mixin TStructWriter; 
} 

auto ms = MyStruct(stream); 
ms.write(stream); 
2

LuaD भी बड़े पैमाने पर मूल लुआ के साथ बातचीत करने metaprogramming उपयोग करता है। आप एक पूरी कक्षा को एक ही कमांड के साथ पंजीकृत कर सकते हैं।

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