请解释With,Block和Module的这种行为

时间:2011-03-09 12:39:00

标签: wolfram-mathematica

美好的一天,

我对此感到困惑:

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]}

如果我使用BlockModule代替With,也会发生同样的情况。

我预计最后DownValues[f]会给出:{HoldPattern[f[x_]]:>ff[x]}。但事实并非如此。请解释一下。

1 个答案:

答案 0 :(得分:2)

来自With的文档。

  

只有当它们不作为作用域构造中的局部变量出现时才替换expr中的符号。

模块和块根本就不是这样做的。

修改以详细说明ModuleBlock。 `原因符号未被替换,是因为它没有被评估。块和模块不进行语法替换操作。尝试

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]}