当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/