为什么这个mathematica模式变量没有被评估?

问题描述:

显然这些模式变量不像我所预期的那样工作。这里有一个简单的例子:为什么这个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" 

感谢,
罗布

发生替换前规则的右手边正在接受评估,所以你需要使用RuleDelayed:>),而不是Rule->):

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

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

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

HTH!

尝试Trace[1 /. x_ -> {x, f[x], ToString[x]}]。我目前无法访问mathematica,但我相信您会看到替换项(特别是ToString[x])在应用之前评估为,因此您正在执行1 /. x_ -> {x, f[x], "x"}

+3

对,你想使用'RuleDelayed',也就是':>'而不是' - >'('Rule')。 – 2010-11-07 21:23:14

+0

@Michael:你应该把它作为一个单独的答案发布,所以我可以放弃它,OP可以接受它! – Cascabel 2010-11-07 22:11:56

+0

谢谢,就是这样。 RuleDelayed而不是Rule。 – 2010-11-07 22:15:09