2011-06-09 39 views
4

该问题的主要观点是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),并在以下情况下,为什么既TraceTraceScan给 最终表达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.)为什么两者都做TraceTraceScan得到最终 表达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}]) 

回答

1

例1和2援引the Documentation

正常情况下,... Trace仅拦截表达式之后函数 参数已被评估。通过设置TraceOriginal->True,您的 可以获得Trace也可以查看之前的函数 参数已经被评估。

似乎设置TraceOriginal->True只是导致前面加上附加信息的Trace默认输出。结果,我们看到了不必要的额外的“中间表达” f[a,1]这真的因为它是由TraceScanTracePrint显示没有出现在两种情况下的评价链条:

In[1]:= ClearAll[f, a]; 
SetAttributes[f, Orderless] 
TracePrint[f[a, 1]] 

During evaluation of In[1]:= f[a,1] 

During evaluation of In[1]:= f 

During evaluation of In[1]:= a 

During evaluation of In[1]:= 1 

During evaluation of In[1]:= f[1,a] 

Out[3]= f[1, a] 

所以它看起来像在Trace的错误。

案例3在这种情况下,一切正常,因为中间表现ff[b,1]确实出现在评价链应用与f相关的定义的结果。没什么意外的

结论:TraceTraceScan都给出了有关评估链的详尽信息,但Trace生成的输出可能还包含误导性的“中间表达式”,实际上这只是链的初始表达式。