美好的一天,
我对此感到困惑:
In[1]:= f[x_]:=With[{xx=x},f[xx_]:=ff[xx]]
DownValues[f]
f[1]
DownValues[f]
Out[2]= {HoldPattern[f[x_]]:>With[{xx=x},f[xx_]:=ff[xx]]}
Out[4]= {HoldPattern[f[xx_]]:>ff[xx]}
如果我使用Block
或Module
代替With
,也会发生同样的情况。
我预计最后DownValues[f]
会给出:{HoldPattern[f[x_]]:>ff[x]}
。但事实并非如此。请解释一下。
答案 0 :(得分:2)
来自With
的文档。
只有当它们不作为作用域构造中的局部变量出现时才替换expr中的符号。
模块和块根本就不是这样做的。
修改以详细说明Module
和Block
。 `原因符号未被替换,是因为它没有被评估。块和模块不进行语法替换操作。尝试
f[x_] := Block[{xx = x}, f[xx_] = ff[xx]]
然后评估f[z]
。
或者,您可以先使用非作用域构造执行初始策略:
f[x_] := With[{xx = x},
Hold[{f[xx_], ff[xx]}] /. {Hold[{a_, b_}] :> SetDelayed[a, b]}]
In[117]:= DownValues[f]
Out[117]= {HoldPattern[f[x_]] :>
With[{xx = x},
Hold[{f[xx_], ff[xx]}] /. {Hold[{a_, b_}] :> (a := b)}]}
In[118]:= f[z]
In[119]:= DownValues[f]
Out[119]= {HoldPattern[f[z_]] :> ff[z]}