2013-01-11 49 views
5

मैं अभी भी मूल्यांकन कर रहा हूं कि मुझे भौतिकी में संख्यात्मक कोड प्रोटोटाइप करने के लिए डी का उपयोग शुरू करना चाहिए।क्या डी std lib में boost.fusion और boost.mpl जैसे कुछ शामिल हैं?

एक चीज जो मुझे रोकती है मुझे बढ़ावा है, विशेष रूप से संलयन और एमपीएल।

डी टेम्पलेट मेटा प्रोग्रामिंग के लिए अद्भुत है और मुझे लगता है कि यह एमपीएल और संलयन सामग्री कर सकता है लेकिन मैं यह सुनिश्चित करना चाहता हूं।

भले ही मैं डी का उपयोग करना शुरू कर दूं, मुझे एमपीएल स्तर तक पहुंचने में कुछ समय लगेगा। तो मैं चाहता हूं कि कोई अपना अनुभव साझा करे।

(एमपीएल से मैं टेम्पलेट्स के लिए और संलयन द्वारा STL का उपयोग कर मतलब है, मैं tuples के लिए STL मतलब है।)

प्रदर्शन पर एक नोट भी अच्छा होगा, क्योंकि यह भौतिकी सिमुलेशन में महत्वपूर्ण है।

+0

आपको वास्तव में * टेम्पलेट * मेटाप्रोग्रामिंग की आवश्यकता नहीं है; डी संकलन समय समारोह मूल्यांकन है। – Mehrdad

+0

@Mehrdad सब कुछ के लिए? आप टेम्पलेट पैरामीटर पर find_if या ट्रांसफॉर्म कर सकते हैं? –

+0

सबकुछ के लिए नहीं (अभी भी बग तय किए जा रहे हैं), लेकिन बहुत सी चीजों के लिए। सामान्य जवाब देना मुश्किल है, लेकिन यदि आपके पास कोई विशेष उदाहरण है तो कृपया इसे पोस्ट करें और मैं देखूंगा कि मुझे इसका एक सीटीएफई संस्करण मिल सकता है और आपको दिखाया जा सकता है। – Mehrdad

उत्तर

7

डी में, अधिकांश भाग के लिए, मेटा-प्रोग्रामिंग सिर्फ प्रोग्रामिंग है। बूस्ट.एमपीएल

जैसी लाइब्रेरी की वास्तव में कोई ज़रूरत नहीं है उदाहरण के लिए, संकलन समय पर संख्याओं की सरणी को सॉर्ट करने के लिए आपको सी ++ में लम्बाई पर जाना होगा। डी में, आप बस कर स्पष्ट बात: का उपयोग std.algorithm.sort

import std.algorithm; 

int[] sorted(int[] xs) 
{ 
    int[] ys = xs.dup; 
    sort(ys); 
    return ys; 
} 

pragma(msg, sorted([2, 1, 3])); 

यह [1, 2, 3] बाहर प्रिंट संकलन समय पर। नोट: sort भाषा में नहीं बनाया गया है और संकलन समय पर काम करने के लिए बिल्कुल कोई विशेष कोड नहीं है।

यहां एक और उदाहरण है जो संकलन समय पर फिबोनाची अनुक्रम के लिए एक लुकअप टेबल बनाता है।

int[] fibs(int n) 
{ 
    auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1); 
    int[] ret = new int[n]; 
    copy(fib.take(n), ret); 
    return ret; 
} 

immutable int[] fibLUT = fibs(10).assumeUnique(); 

यहाँ, fibLUT जरूरत किसी विशेष संकलन समय कोड के बिना संकलन समय पर पूरी तरह से निर्माण किया है, फिर से।

यदि आप प्रकारों के साथ काम करना चाहते हैं, तो std.typetuple में कुछ प्रकार के मेटा फ़ंक्शंस हैं। उदाहरण के लिए:

static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) == 
       TypeTuple!(ubyte, uint, ulong))); 

पुस्तकालय यही कारण है, मुझे विश्वास है, कार्यक्षमता आप फ्यूजन से प्राप्त कर सकते हैं का सबसे शामिल हैं। याद रखें, आपको वास्तव में सी ++ में जितना अधिक करते हैं, उतना ही डी में टेम्पलेट मेटा-प्रोग्रामिंग सामान का उपयोग करने की आवश्यकता नहीं है, क्योंकि अधिकांश भाषा संकलित समय पर उपलब्ध है।

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