2011-03-09 28 views
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]}。但事實並非如此。請解釋。

回答

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

這是正確的'Module'?從文檔中不清楚。 – 2011-03-09 13:28:09

+0

@Alexey請參閱我編輯的回覆。 – Sasha 2011-03-09 13:37:12