The fp
论证TraceScan
用两个参数调用。第一个是原始的未计算表达式。二是评价结果。在你的例子中,第二个AppendTo
正在使用第一个参数,因此您会看到未计算的表达式。改变#
to #2
然后你就会看到你期望的结果。
另请注意,第二个参数是not包装成HoldForm
(尽管有文档),所以一般来说,必须小心使用一个保存其参数的函数fp
论证以避免产生虚假的评估。
比较 Trace 和 TraceScan
的行为Trace
在Mathematica 8 文档 http://reference.wolfram.com/mathematica/tutorial/TracingEvaluation.html。它指出,默认情况下,Trace
只显示表情after头部和参数已被评估。因此,我们看到这样的序列:
In[28]:= SetAttributes[f, Orderless]
Trace[f[a, 1]]
Out[29]= {f[a,1],f[1,a]}
仅显示输入表达式及其结果。这TraceOriginal
选项控制(引用)“是否在计算头和参数之前查看表达式”。当该选项为True
然后输出补充有头表达式和参数表达式:
In[30]:= Trace[f[a,1], TraceOriginal->True]
Out[30]= {f[a,1],{f},{a},{1},f[a,1],f[1,a]}
新列表的第一个元素是原始表达式before头部和参数被评估。然后我们看到头部和参数正在被评估。最后,我们看到顶级表达式again,在对 head 和参数进行求值之后。列表的最后两个元素与原始跟踪输出的两个元素匹配。
正如链接文档所述,Trace
对于返回的表达式非常有选择性。例如,它完全省略了琐碎的评估链。TraceScan
是全面的,并且为每个评估(无论是否琐碎)调用所提供的函数。您可以使用以下内容查看全面的评估集TraceScan
表达:
TraceScan[Print, f[a,1], _, Print[{##}]&]
下表与生成的输出相匹配Trace
有和没有TraceOriginal
,以及输出TraceScan
表达:
Trace Trace TraceScan
Original
f[a,1] f[a,1]
f
{f} {f
,f}
a
{a} {a
,a}
1
{1} {1
,1}
f[1,a]
{f[1,a]
,f[1,a]}
f[a,1] f[a,1] {f[a,1]
f[1,a] f[1,a] ,f[1,a]}
鉴于该表的内部结构,对于哪个条目与哪个条目匹配存在一定程度的猜测Trace
无法访问。进一步的实验可能会提供调整对齐的信息。然而,关键的一点是,所有由Trace
可以使用TraceScan
-- and TraceScan
提供更多。