该问题的主要观点是TraceScan
(以及相关的第四个参数,但对于所讨论问题不需要)的第一个参数的操作背后的逻辑:它有时会排除一些评估步骤(其中Trace
与选项TraceOriginal->True
给出),但有时它包括它们,如以下示例中所示。我有兴趣了解此行为背后的逻辑,以及如何强制TraceScan
提供完整的评估步骤。这个问题最初出现在this线程中(请参阅我对评论的回答)。的TraceScan
行为的一般比较,因为相比的Trace
被WReach here给出,但它并没有回答以下问题:TraceScan上的问题
1)为什么不TraceScan
让在这个 情况而最终表达f[a,1]
Trace
给出:
In[1]:= SetAttributes[traceScan,HoldAll];
traceScan[expr_]:=(list={};TraceScan[AppendTo[list,#]&,expr];list)
In[3]:= ClearAll[f,a];
Trace[f[a,1],TraceOriginal->True]
Out[4]= {f[a,1],{f},{a},{1},f[a,1]}
In[5]:= ClearAll[f,a];
traceScan[f[a,1]]
Out[6]= {f[a,1],f,a,1}
2),并在以下情况下,为什么既Trace
和TraceScan
给 最终表达f[1,a]
wheras只Trace
GI VES其对应于评价的步骤施加Orderless
属性的f
之前的中间表现 f[a,1]
:在最后这种情况下
In[7]:= ClearAll[f,a];
SetAttributes[f,Orderless]
Trace[f[a,1],TraceOriginal->True]
Out[9]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]}
In[12]:= ClearAll[f,a];
SetAttributes[f,Orderless]
traceScan[f[a,1]]
Out[14]= {f[a,1],f,a,1,f[1,a]}
3.)为什么两者都做Trace
和TraceScan
得到最终 表达ff[1,b]
和中间表达式ff[b,1]
,其对应于在应用的Orderless
属性之前的评估步骤:
In[21]:= ClearAll[f,ff,a];
SetAttributes[ff,Orderless];f=ff;a=b;
Trace[f[a,1],TraceOriginal->True]
Out[23]= {f[a,1],{f,ff},{a,b},{1},ff[b,1],ff[1,b]}
In[24]:= ClearAll[f,ff,a];
SetAttributes[ff,Orderless];f=ff;a=b;
traceScan[f[a,1]]
Out[26]= {f[a,1],f,ff,a,b,1,ff[b,1],ff[1,b]}
4.)有没有办法迫使TraceScan
始终给予详尽的 有关评估信息为Trace
呢?
此外
这里是另一个,的traceScan
更多信息的版本,其使用了第四个参数:
SetAttributes[traceScan, HoldAll];
traceScan[expr_] := (list1 = list2 = {};
TraceScan[AppendTo[list1, #] &, expr, _,
AppendTo[list2, {##}]&];
Column[{list1, list2}])