请解释 With、Block 和 Module 的行为

4

你好,

我对以下内容感到有些困惑:

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个回答

2

以下是With文档中的内容:

With只会替换expr中不被作为局部变量包含在作用域结构里的符号。

ModuleBlock并不适用于此操作。

Edit以澄清关于ModuleBlock的说明。原因是符号没有被评估,所以不会被替换。BlockModule不执行语法替换操作。请尝试:

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

这对于“模块”来说是正确的吗?文档中并不清楚。 - Alexey Popkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接