When trying to simulate the evaluation behavior of RuleDelayed I faced unexpected behavior of nested Unevaluated. Consider:
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]
One can see that only even number of nested Unevaluated wrappers are completely removed. Why?
Use Trace to see why:
Unevaluatedlanguage construct,f[Unevaluated[1 + 1]]evaluates just likef[1 + 1]except the1 + 1is left unevaluated.f[1 + 1]does not match the definition you gave forf.f[Unevaluated[1 + 1]]remains unevaluated.Whereas:
Unevaluatedlanguage construct,f[Unevaluated@Unevaluated[1 + 1]]evaluates just likef[Unevaluated[1 + 1]]except theUnevaluated[1 + 1]is left unevaluated.f[Unevaluated[1 + 1]]matches the definition you gave forf, and evaluates tof[1 + 1].f[Unevaluated@Unevaluated[1 + 1]]evaluates tof[2].