为什么不评估此mathematica模式变量?

时间:2010-11-07 21:16:40

标签: wolfram-mathematica

显然这些模式变量不像我期望的那样工作。这是一个简单的例子:

In[264]  :=  1 /. x_ -> {x, f[x], ToString[x]}
Out[264] := {1, f[1], "x"}

为什么最后一个元素是“x”而不是“1”。以下工作符合预期。

In[267]:= y = 2;
   ToString[y]
Out[268]= "2"

感谢,
罗布

2 个答案:

答案 0 :(得分:4)

在替换发生之前,正在评估规则的右侧,因此您需要使用RuleDelayed:>)而不是Rule->) :

In[1]:= 1 /. x_ :> {x, f[x], ToString[x]}

Out[1]= {1, f[1], "1"}

RuleRuleDelayed类似于Set=)和SetDelayed:=)。

HTH!

答案 1 :(得分:3)

试试Trace[1 /. x_ -> {x, f[x], ToString[x]}]。我目前无法访问mathematica,但我相信您会看到替换,特别是ToString[x],在应用模式之前进行评估,因此您实际上是有效的重新做1 /. x_ -> {x, f[x], "x"}