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我在编辑你的评论时:)。我做了同样的事,谢谢你!这项功能是否完全没有文档记录?我还没有看到文档记录,但可能是因为我没有给予足够的重视,它写在文档的某个地方。