2011-06-08 67 views
6

trying模擬評估行爲RuleDelayed我遇到了嵌套Unevaluated的意外行爲。試想一下:嵌套問題無法評估

In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr] 
f[Unevaluated[1 + 1]] 
f[[email protected][1 + 1]] 
f[[email protected]@Unevaluated[1 + 1]] 
f[[email protected]@[email protected][1 + 1]] 

Out[2]= f[Unevaluated[1 + 1]] 

Out[3]= f[2] 

Out[4]= f[Unevaluated[1 + 1]] 

Out[5]= f[2] 

人們可以看到,只有偶數嵌套Unevaluated包裝的完全去除。爲什麼?

回答

8

使用跟蹤明白爲什麼:

In[1]:= f[Verbatim[Unevaluated][expr_]]:=f[expr] 

In[2]:= f[Unevaluated[1+1]]//Trace 
Out[2]= {f[1+1],f[Unevaluated[1+1]]} 
  1. 由於Unevaluated語言結構的定義特殊屬性,f[Unevaluated[1 + 1]]評估類似,只是在1 + 1f[1 + 1]留下未評估。
  2. f[1 + 1]與您給出的f的定義不符。
  3. 因此f[Unevaluated[1 + 1]]仍未評估。

鑑於:

In[3]:= f[[email protected][1 + 1]] // Trace 
Out[3]= {f[Unevaluated[1+1]],f[1+1],{1+1,2},f[2]} 
  1. 由於Unevaluated語言結構的定義特殊屬性,f[[email protected][1 + 1]]評估類似,只是在Unevaluated[1 + 1]f[Unevaluated[1 + 1]]留下未評估。
  2. f[Unevaluated[1 + 1]]與您給出的f的定義相符,並且評估爲f[1 + 1]。因此f[[email protected][1 + 1]]評估爲f[2]
+0

哇,我真的打你幾秒鐘的答案=) – 2011-06-08 06:10:02

+0

是啊!一個小時以前的問題很巧合。我總體上更喜歡你的答案。 – 2011-06-08 06:17:09

+0

非常明確的解釋,謝謝!兩種答案都很好,並且相互補充,但是你對評估者採取的一系列決定形式的解釋更加簡單和易於記憶。所以我接受你的答案。 – 2011-06-08 07:35:13

9

關鍵是,在表達式模式匹配之前,有效地刪除了一層Unevaluated。從docs

f[Unevaluated[expr]]有效地工作 通過臨時設置屬性,這樣 是f持有它的參數未計算, 然後評估f[expr]

因此,在第一種情況下,f[Unevaluated[1 + 1]]評價爲f[1 + 1],但圖案匹配即使f缺乏Hold*屬性時殘留未計算,和因爲沒有匹配f[1 + 1],所述原始表達(預圖案 - 匹配)返回未評估。

在第二種情況下,f[Unevaluated[Unevaluated[1 + 1]]]評估爲f[Unevaluated[1 + 1]]在模式匹配器,其確實f匹配的模式,然後f[1 + 1]遞歸評價,因此你得到f[2]

在第三種情況下,f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]評估爲f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]],匹配,並遞歸評估爲f[Unevaluated[1 + 1]],我們又回到第一種情況。

在第四種情況下,f[Unevaluated[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]]f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]比賽,遞歸地評估f[Unevaluated[Unevaluated[1 + 1]]],我們又回到了第二種情況。

HTH!