2011-06-19 15 views
5

मैं जब यह मूल अभिव्यक्ति में अनुपस्थित है वैकल्पिक तर्क color_RGBColor जो Sequence[] साथ प्रतिस्थापित किया जाना चाहिए के साथ एक प्रतिस्थापन नियम निर्धारित करने की कोशिश कर रहा हूँ:पैटर्न

style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

जब RGBColor में मौजूद है मूल अभिव्यक्ति, नियम काम करता है:

style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

=> {RGBColor[{}], Line[]} 

लेकिन जब यह अनुपस्थित है, यह नहीं है:

style[Line[], Thickness[0.01]] /. 
Style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

=> style[Line[], Thickness[0.01]] 

मेरे प्रश्न हैं:

1) यह क्यों काम नहीं करता है?

2) क्या एक ऐसा पैटर्न बनाना संभव है जो वांछित के रूप में काम करेगा?

उत्तर

7

आपका पैटर्न डिफ़ॉल्ट (वैकल्पिक) तर्कों के लिए पैटर्न-मिलान करने के तरीके के कारण काम नहीं करता है, और क्योंकि आपने सिर को RGBColor पर प्रतिबंधित कर दिया है। समस्या यह है कि डिफ़ॉल्ट तर्क मान पैटर्न से मेल खाना चाहिए, जबकि Unevaluated[Sequence[]] निश्चित रूप से _RGBColor से मेल नहीं खाता है।

आपके पास कई तरीके हैं। एक पहला प्रयास अपने प्रकार-चेकिंग कमजोर करने के लिए है:

In[10]:= style[Line[],Thickness[0.01]]/. 
style[line_Line,___,color_: [email protected][],___]:>{color,line} 

Out[10]= {Thickness[0.01],Line[]} 

लेकिन यह काम नहीं करता है के बाद से मिलान सही नहीं है - टाइपिंग वास्तव में बहुत कमजोर है।

In[14]:= style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, color : (_RGBColor | _Unevaluated) : 
    [email protected][], ___] :> {[email protected], line} 


Out[14]= {RGBColor[{}], Line[]} 

In[15]:= style[Line[], Thickness[0.01]] /. 
    style[line_Line, ___, color : (_RGBColor | _Unevaluated) : 
    [email protected][], ___] :> {[email protected], line} 

Out[15]= {Line[]} 

यह करने के लिए सुझाया गया तरीका यह है::

In[18]:= style[Line[], Thickness[0.01]] /. 
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :> 
    If[color === Automatic, {line}, {color, line}] 


Out[18]= {Line[]} 

In[17]:= style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :> 
    If[color === Automatic, {line}, {color, line}] 


Out[17]= {RGBColor[{}], Line[]} 

पैटर्न मिलान की यह सुविधा बहुत व्यापक रूप से ज्ञात नहीं है, इसलिए मैं तनाव होगा यह काम करने के लिए hacky तरीका यह है इसे दोबारा: (वैकल्पिक) पैटर्न x:ptrn:default के लिए डिफ़ॉल्ट मान ptrn से मेल खाना चाहिए। इस तरह के व्यवहार के एक और उदाहरण के लिए, this गणित चर्चा देखें।

+0

धन्यवाद! क्या यह सुविधा पूरी तरह से अनियंत्रित है? –

+0

मैंने इसे दस्तावेज नहीं देखा है, लेकिन हो सकता है कि मैं पर्याप्त ध्यान नहीं दे रहा था और यह दस्तावेज़ीकरण में कहीं लिखा गया है। –

2

शायद यह आप के लिए काम करता है:

style[Line[a], RGBColor[{}]] /. 
style[line_Line, ___, Longest[color___RGBColor], ___] :> {color,line} 
(* 
{RGBColor[{}], Line[a]} 
*) 

style[Line[]] /. 
style[line_Line, ___, Longest[color___RGBColor], ___] :> {color, line} 
(* 
{Line[]} 
*) 

मुझे लगता है कि अपने प्रतिस्थापन नियम सिर्फ काम नहीं करता है एक प्रमुख RGBColor के साथ कोई तत्व है, क्योंकि, इसलिए वहाँ कोई मुकाबला नहीं है।

+0

इस तरह से 'सबसे लंबा' और यहां तक ​​कि 'वैकल्पिक' की आवश्यकता नहीं है - 'खाली' के साथ 'खाली' के प्रतिस्थापन 'रिक्त' के साथ चाल है: 'शैली [रेखा []] /। शैली [line_Line, ___, color___RGBColor, ___]:> {रंग, रेखा} '। लेकिन यह 'खाली 'के साथ क्यों काम नहीं करता है? –

+0

@Alexey मैं आपकी टिप्पणी पोस्ट करते समय संपादन कर रहा था :)। मैंने वही किया –

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