在你In[26]
的评估者已经根据你在(你写的)看到它 d
之前为它建立的规则重写了它。ReplaceRepeated
//.
Mathematica 的求值器非常贪婪且优先级较低,因此in//.
左侧的表达式已重写为//.
In[26]
((b+c)^2/e^2+something)/(tmp-1)
在您的替换规则有机会运行之前。由于该表达式不包含任何d
替换规则d->tmp
,因此不使用。
你有很多选择。
d
a)您可以为例如d:=tmp
或d=tmp
在这种情况下评估写一个新的表达式
(d^2+something)/(d-1)
会产生
(something + tmp^2)/(-1 + tmp)
b)您可以删除d
通过评估制作的定义,d:=a/e
并在您想要转换包括d
.
c) 您可以研究函数的定义和使用,例如Hold[]
和HoldFirst[]
以及涵盖 Mathematica 通常评估过程以及如何修改它的文档的那些部分。
d) 与 Mathematica 一样,还有其他方法可以实现您想要的,最佳选择将取决于您正在尝试做什么。
要回答您的特定问题,如果我希望在评估步骤期间每次发生 d 时都被替换,我做错了什么?:您正在定义重写规则d:=a/e
并将其放入规则集中,以便在评估之后在会话中评估的任何表达式期间尝试。
编辑回应评论
d:=a/e
不是临时替换,它是一个持续存在的定义,直到删除或替换或您关闭会话。通常,使用规则(例如您的d->tmp
. 当然,Mathematica 就是这样,您可以将规则分配给变量,例如
rule1 = d->a/e
并以明显的方式使用它们
expression /. rule1
您可以定义规则列表
rule_list = {d->tmp, e->tmp2, f-> tmp3}
等等。