Почему RuleDelayed не удерживает Unevaluated?

Средство оценки Mathematica обычно выполняется (или восстанавливает?) ) Head s Неоцененные выражения, предоставленные в качестве аргументов для Symbol s:

In[1]:= f[s, Unevaluated[1 + 1]]

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

In[5]:= Trace[f[s,Unevaluated[1+1]],TraceOriginal->True]

Out[5]= {f[s,Unevaluated[1+1]],{f},{s},f[s,1+1],f[s,Unevaluated[1+1]]}

Но это неверно для RuleDelayed . Кроме того, любое количество неоцененных оболочек удаляется в случае RuleDelayed :

In[1]:= Attributes@RuleDelayed
RuleDelayed[s, Unevaluated[1 + 1]]
RuleDelayed[s, Unevaluated@Unevaluated[1 + 1]]
RuleDelayed[s, Unevaluated@Unevaluated@Unevaluated[1 + 1]]
RuleDelayed[Unevaluated@Unevaluated@Unevaluated[1 + 1], 1 + 1]

Out[1]= {HoldRest, Protected, SequenceHold}

Out[2]= s :> 1 + 1

Out[3]= s :> 1 + 1

Out[4]= s :> 1 + 1

Out[5]= 2 :> 1 + 1

Почему средство оценки удаляет любое количество Неоцененные оболочки в случае RuleDelayed ? Для каких целей это полезно? Можно ли смоделировать такое поведение для произвольного символа (например, f )?


Также неясно, почему трасса показывает более сложную изображение для RuleDelayed , чем для f :

In[2]:= Trace[RuleDelayed[s,1+1],TraceOriginal->True]
Out[2]= {s:>1+1,{RuleDelayed},{s},s:>1+1,s:>1+1,{RuleDelayed},{s},s:>1+1}

Похоже, RuleDelayed оценивается дважды ...

7
задан Sjoerd C. de Vries 3 January 2012 в 22:50
поделиться