为什么这个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"}
Rule
和RuleDelayed
类似于Set
(=
)和SetDelayed
(:=
)。
HTH!
答
尝试Trace[1 /. x_ -> {x, f[x], ToString[x]}]
。我目前无法访问mathematica,但我相信您会看到替换项(特别是ToString[x]
)在应用之前评估为,因此您正在执行1 /. x_ -> {x, f[x], "x"}
。
对,你想使用'RuleDelayed',也就是':>'而不是' - >'('Rule')。 – 2010-11-07 21:23:14
@Michael:你应该把它作为一个单独的答案发布,所以我可以放弃它,OP可以接受它! – Cascabel 2010-11-07 22:11:56
谢谢,就是这样。 RuleDelayed而不是Rule。 – 2010-11-07 22:15:09