Wolfram mathematica 替换规则中带有可选参数的模式
我试图用可选参数Wolfram mathematica 替换规则中带有可选参数的模式,wolfram-mathematica,Wolfram Mathematica,我试图用可选参数color\u RGBColor定义替换规则,如果原始表达式中没有该参数,则应将其替换为Sequence[]: style[line_Line, ___, color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line} 当原始表达式中存在RGBColor时,规则起作用: style[Line[], RGBColor[{}]] /. style[line_Line, ___, color_RGBC
color\u RGBColor
定义替换规则,如果原始表达式中没有该参数,则应将其替换为Sequence[]
:
style[line_Line, ___,
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}
当原始表达式中存在RGBColor
时,规则起作用:
style[Line[], RGBColor[{}]] /.
style[line_Line, ___,
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}
=> {RGBColor[{}], Line[]}
但当它不存在时,它不会:
style[Line[], Thickness[0.01]] /.
Style[line_Line, ___,
color_RGBColor: Unevaluated@Sequence[], ___] :> {color, line}
=> style[Line[], Thickness[0.01]]
我的问题是:
1) 为什么它不起作用
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[]}
*)
我猜您的替换规则不起作用,仅仅是因为没有具有Head的元素
RGBColor
,所以没有匹配。您的模式不起作用,这是因为默认(可选)参数的模式匹配工作方式,还因为您将Head限制为RGBColor
。问题是默认参数值必须与模式匹配,而未计算的[Sequence[]]
肯定与\u RGBColor
不匹配
你有好几种出路。第一个尝试是削弱您的类型检查:
In[10]:= style[Line[],Thickness[0.01]]/.
style[line_Line,___,color_: Unevaluated@Sequence[],___]:>{color,line}
Out[10]= {Thickness[0.01],Line[]}
但这不起作用,因为匹配不正确-键入的内容确实太弱。让它工作的黑客方法是:
In[14]:= style[Line[], RGBColor[{}]] /.
style[line_Line, ___, color : (_RGBColor | _Unevaluated) :
Unevaluated@Sequence[], ___] :> {Evaluate@color, line}
Out[14]= {RGBColor[{}], Line[]}
In[15]:= style[Line[], Thickness[0.01]] /.
style[line_Line, ___, color : (_RGBColor | _Unevaluated) :
Unevaluated@Sequence[], ___] :> {Evaluate@color, 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[]}
模式匹配器的这一特性并不广为人知,因此我将再次强调:模式(可选)的默认值
x:ptrn:default
必须匹配ptrn
。有关此类行为的另一个示例,请参见Mathgroup讨论。这样就不需要最长的
甚至可选的
——将空白的
替换为空白的空序列
可以达到以下目的:样式[Line[]/。样式[线条,颜色,颜色,RGBColor,颜色]:>{color,line}
。但是为什么它不适用于Blank
?@Alexey我在编辑你的评论时:)。我做了同样的事,谢谢你!这项功能是否完全没有文档记录?我还没有看到文档记录,但可能是因为我没有给予足够的重视,它写在文档的某个地方。