La clave es que, de hecho, una capa de Unevaluated
se elimina antes de que la expresión coincida con el patrón. Desde el docs:
f[Unevaluated[expr]]
funciona de manera efectiva por atributos de ajuste temporal de modo que f
sostiene su argumento no evaluada, a continuación, evaluar f[expr]
.
Así, en el primer caso, f[Unevaluated[1 + 1]]
se evalúa como f[1 + 1]
, pero restante sin evaluar durante coincidencia de patrones, aunque f
carece de Hold*
atributos, y puesto que nada coincide f[1 + 1]
, la original de expresión (pre-patronaje emparejamiento) se devuelve sin evaluar.
En el segundo caso, f[Unevaluated[Unevaluated[1 + 1]]]
evalúa como f[Unevaluated[1 + 1]]
en el patrón de coincidencias, que hace coincidir con un patrón de f
, y luego f[1 + 1]
se evalúa de forma recursiva, y por lo tanto presentamos lo mejor f[2]
.
En el tercer caso, f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]
se evalúa como f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]
, coincide y se evalúa recursivamente como f[Unevaluated[1 + 1]]
, y volvemos al primer caso.
En el cuarto caso, f[Unevaluated[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]]
coincide en f[Unevaluated[Unevaluated[Unevaluated[1 + 1]]]]
, evalúa recursivamente f[Unevaluated[Unevaluated[1 + 1]]]
, y volvemos al segundo caso.
HTH!
Wow literalmente te gané a la respuesta por segundos =) –
¡Sí! Buena coincidencia para una pregunta de una hora. Me gusta tu respuesta mejor en general. –
Explicación muy clara, ¡gracias! Ambas respuestas son excelentes y se complementan entre sí, pero su explicación en forma de una secuencia de decisiones tomadas por el evaluador es más esquemática y más fácil de recordar. Entonces acepto tu respuesta. –