2011-12-15 20 views
6

यह एक शाखा और का विस्तार है: Is it safe to turn off Pattern::patv?मेथेमेटिका में लचीला तर्क हैंडलिंग कार्य करता

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

मुझे एक उदाहरण के रूप में एक डमी फ़ंक्शन foo परिभाषित करने दें।

Off[Pattern::patv] 

p = {_?NumericQ, _?NumericQ}; 

foo[ 
    {x : p ..} | x : p, 
    {y__} | y__, 
    ops : OptionsPattern[] 
] /; Max[y] <= 10 := bar[#, y, ops] & /@ {x} 

foo स्वीकार करता है, क्रम में:

  • एक वस्तु मिलान पैटन p, या इस तरह की वस्तुओं की एक सूची।
  • 10 की एक अधिकतम मूल्य के साथ परोक्ष सांख्यिक वस्तुओं का एक सेट, या तो सूची या तर्कों के एक दृश्य OptionsPattern[]
  • मिलान
  • विकल्प (के रूप में इन वस्तुओं लिखा खुद को 10 की एक अधिकतम मूल्य के साथ संख्यात्मक सूचियों हो सकता है) के रूप में

यदि इनमें से कोई भी स्थिति पूरी नहीं हुई है, तो foo[args] अनचाहे वापस कर दिया गया है।

Alternatives (|) का उपयोग करने वाले दो पैटर्न सबसे आम मामले हैं, लेकिन वे अनन्य नहीं हैं।

मैं यह देखने के लिए संघर्ष करता हूं कि foo को सर्वोत्तम तरीके से कार्यान्वित किया जाना चाहिए।

  • इसे पूरा करने के लिए कैननिक तरीका क्या है?

  • Alternatives का उपयोग करने पर इसके क्या फायदे हैं?

  • क्या यह आसानी से पढ़ना आसान है?

उत्तर

4

मेरा मानना ​​है कि लचीला तर्क के साथ काम कर के तीन विहित तरीके देखते हैं कि:

  1. कुछ भी जाता है: f[x_],
  2. कई रूपों: f[{x : p ..}] और f[x:p] जहां एक अन्य कहता है, और
  3. विकल्प: f[{x : p ..} | x : p]

प्राथमिक अंतर वह है जहां आप लचीली तर्कों की अतिरिक्त जटिलता से निपटते हैं। प्रत्येक के फायदे हो सकते हैं।

कुछ भी का प्राथमिक लाभ स्वीकार्य पैटर्न बनाने में सादगी है, लेकिन यह उस कार्य के आंतरिक भाग को प्रसंस्करण छोड़ देता है जो इसकी जटिलता को बढ़ाता है। इस के अच्छे उदाहरण के लिए ErrorBarPlots.m फ़ाइल देखें। आखिरकार, ErrorListPlot पहली विधि के मुखौटे के पीछे छिपी दूसरी विधि पर निर्भर करता है।

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

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

+0

उत्तर देने के लिए धन्यवाद। कृपया कुछ कोड नमूने शामिल करें, विशेष रूप से आप कैसे कार्यान्वित करेंगे "यदि इनमें से कोई भी स्थिति पूरी नहीं हुई है, तो foo [args] को अनावश्यक रूप से वापस कर दिया गया है।" विधियों के साथ 1. और 2. (मुझे लियोनिद की विधि पता है, लेकिन क्या आप इसका उपयोग करते हैं?) –

+0

@ श्री विज़ार्ड, मुझे कुछ घंटे दें। मैंने इसे अपने सिर के ऊपर से लिखा, और किसी भी कोड के नमूने नहीं फेंक दिया था। – rcollyer

+0

कोई जल्दी नहीं है; धन्यवाद। –

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