Средство оценки 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
оценивается дважды ...