डी

2011-04-28 8 views
22

में शुद्ध कार्यात्मक प्रोग्रामिंग मेरे दिमाग में कार्यात्मक शुद्धता की शक्ति तब होती है जब गहरे कोड पथ को दुष्प्रभाव मुक्त के रूप में सत्यापित किया जा सकता है। कोड पेड़ के पैमाने में लोगों के अनुभव क्या हैं जो शुद्ध विनिर्देशक के अंदर हो सकते हैं, और कोड पुन: उपयोग के स्तर का क्या हो सकता है?डी

कुछ बातें मैं देखा:

std.algorithm ज्यादातर pure के रूप में चिह्नित नहीं है, लेकिन संभावित काफी हद तक शुद्ध हो सकता है, या तो instantiating समारोह या mixin की शुद्धता की मांग एल्गोरिदम का एक शुद्ध संस्करण से, वरना शुद्धता से स्पष्ट रूप से स्थिर रूप से polymorphic होने के नाते।
to!string(someInt) जैसे उपयोगी कन्वर्टर्स वर्तमान में शुद्ध नहीं हैं।

उपयोगकर्ता परिभाषित structs के साथ (जैसा कि नीचे बताया) समस्याओं के लिए लग रहे हैं: एक नेस्टेड struct पर
1. शुद्ध विनाशकर्ता
2. भी एक गैर नेस्टेड struct

निम्नलिखित कोड पर एक शुद्ध postblit समारोह वर्तमान में डीएमडी 2.052 पर कई त्रुटियों को जीतने के 32-बिट

struct InnerStruct 
{ 
    pure this(this) {} 
    pure ~this() {} 
} 

struct OuterStruct 
{ 
    InnerStruct innerStruct; 
    pure this(this) {} 
    pure ~this() {} 
} 

pure void somePureFunc() 
{ 
    OuterStruct s1 = OuterStruct(); // pure nested destructor does not compile 
    OuterStruct s2 = s1; 
    InnerStruct is1 = InnerStruct(); // pure non-nested destructor seems to compile 
    InnerStruct is2 = is1; // pure non-nested postblit does not compile 
} 

void main() 
{ 
    somePureFunc(); 
} 
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '__cpctor' 
pure_postblit.d(20): Error: pure function 'somePureFunc' cannot call impure function '__cpctor' 
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '~this' 
pure_postblit.d(17): Error: pure function 'somePureFunc' cannot call impure function '~this' 

उत्तर

21

सिद्धांत रूप में डी में pure की बात है कि यह gu अनुमति देने के लिए माना जाता है देता है arantees कि एक समारोह साइड इफेक्ट मुक्त है चाहे इस समारोह को कैसे लागू किया जाता है। वहाँ डी में पवित्रता के दो प्रकार हैं:

  • सभी कार्यों में चिह्नित pure दुर्बलता से शुद्ध कर रहे हैं। वे किसी भी वैश्विक परिवर्तनीय स्थिति (वैश्विक चर, थ्रेड-स्थानीय चर, static चर, इत्यादि) तक पहुंच नहीं सकते हैं या I/O निष्पादित नहीं कर सकते हैं। हालांकि, वे अपने तर्कों को बदल सकते हैं। इन कार्यों का बिंदु यह है कि उन्हें मजबूत शुद्धता की गारंटी के उल्लंघन के बिना दृढ़ता से शुद्ध कार्यों (नीचे विस्तृत) से बुलाया जा सकता है।

  • सभी कार्यों कि कमजोर शुद्ध और परिवर्तनशील अविवेक के साथ किसी भी तर्क नहीं है दृढ़ता से शुद्ध कर रहे हैं। const और immutable टाइप कन्स्ट्रक्टर का उपयोग इस गारंटी के लिए किया जा सकता है। (Structs और कक्षाओं से निपटने पर, this पॉइंटर को पैरामीटर माना जाता है।) मजबूत शुद्ध कार्यों में सभी अच्छे गुण होते हैं जो कार्यात्मक प्रोग्रामिंग लोग बात करते हैं, भले ही वे उत्परिवर्तनीय स्थिति का उपयोग करके कार्यान्वित किए जाएं। एक दृढ़ शुद्ध कार्य हमेशा किसी भी दिए गए तर्क के लिए समान मूल्य देता है और इसका कोई दुष्प्रभाव नहीं होता है। दृढ़ता से शुद्ध कार्य संदर्भित रूप से पारदर्शी होते हैं, जिसका अर्थ है कि उनके वापसी मूल्य को देखने योग्य व्यवहार को प्रभावित किए बिना पैरामीटर के दिए गए सेट के साथ उन्हें कॉल के लिए प्रतिस्थापित किया जा सकता है। किसी भी दृढ़ता से शुद्ध कार्य को किसी अन्य दृढ़ शुद्ध कार्य के साथ समानांतर में सुरक्षित रूप से निष्पादित किया जा सकता है।

दुर्भाग्य से सामान्य कोड और pure (और साथ ही const और immutable) के बीच बातचीत नहीं बल्कि गरीब है। इसे ठीक करने के कई प्रस्ताव हुए हैं, लेकिन अभी तक कोई भी स्वीकार नहीं किया गया है।
\ std.algorithm जितना संभव हो उतना सामान्य माना जाता है, इसलिए इसकी आवश्यकता नहीं हो सकती है कि इसके लैम्ब्डा फ़ंक्शंस और श्रेणियां इसे स्वीकार करें। इसके अलावा, डी 2 में जोड़े गए सिस्टम सिस्टम फीचर्स आमतौर पर भाषा में सबसे अधिक बग्गी विशेषताएं हैं, क्योंकि प्रासंगिक मुद्दों को ठीक करने से पहले अधिक बुनियादी चीजों को प्राथमिकता दी गई है। अभी, pure मूल रूप से std.math जैसे मामूली मामलों को छोड़कर उपयोग करने योग्य नहीं है।

+0

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

+0

@ जॉन: हाँ, ये शायद बग हैं। – dsimcha