trying模拟RuleDelayed的评估行为时,我遇到了嵌套Unevaluated的意外行为。考虑:

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

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

Out[3]= f[2]

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

Out[5]= f[2]

可以看到,只有偶数个嵌套的Unevaluated包装器被完全删除了。为什么?

最佳答案

使用跟踪来查看原因:

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

In[2]:= f[Unevaluated[1+1]]//Trace
Out[2]= {f[1+1],f[Unevaluated[1+1]]}
  • 由于定义了Unevaluated语言构造的特殊属性,因此f[Unevaluated[1 + 1]]的计算方式与f[1 + 1]相同,只是未对1 + 1进行评估。
  • f[1 + 1]与您为f给出的定义不匹配。
  • 因此,f[Unevaluated[1 + 1]]未被评估。

  • 然而:
    In[3]:= f[Unevaluated@Unevaluated[1 + 1]] // Trace
    Out[3]= {f[Unevaluated[1+1]],f[1+1],{1+1,2},f[2]}
    
  • 由于定义了Unevaluated语言构造的特殊属性,因此f[Unevaluated@Unevaluated[1 + 1]]的计算方式与f[Unevaluated[1 + 1]]相同,只是未对Unevaluated[1 + 1]进行评估。
  • f[Unevaluated[1 + 1]]与您为f给出的定义匹配,并且评估为f[1 + 1]
  • 因此,f[Unevaluated@Unevaluated[1 + 1]]的计算结果为f[2]
  • 关于wolfram-mathematica - 关于嵌套未评估的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6274471/

    10-10 02:37