Wolfram mathematica 请解释With、Block和Module的这种行为
你好 我对此有点困惑:Wolfram mathematica 请解释With、Block和Module的这种行为,wolfram-mathematica,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]} 如果使用Block或Module而不是With,也会发生同样的情况 我希望最后一个DownValues[f]将给出:{
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]}
。但事实并非如此。请解释。来自的文档
With仅在expr中的符号不作为作用域构造中的局部变量出现时才替换这些符号
模块和块根本不打算这么做
编辑详细说明模块
和块
`未替换符号的原因是未对其进行求值。块和模块不执行语法替换操作。试一试
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]}
这是否适用于模块
?从文件中看不清楚。