Аргумент fp
для TraceScan
вызывается с двумя аргументами.Первое - это оригинальное неоцененное выражение.Второе - результат оценки.В вашем примере второй AppendTo
использует первый аргумент, поэтому вы видите неоцененное выражение.Измените #
на #2
, и тогда вы увидите ожидаемые результаты.
Также обратите внимание, что второй аргумент - , а не , заключенный в HoldForm
(несмотря на документацию), поэтому вВ общем случае следует позаботиться об использовании функции, которая содержит свои аргументы для аргумента fp
, чтобы избежать создания ложных оценок.
Сравнение Trace и TraceScan
ПоведениеTrace
подробно описан в документации Mathematica 8 .В нем говорится, что по умолчанию Trace
показывает только выражения после заголовок и аргументы были оценены.Таким образом, мы видим такую последовательность:
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]}
Первым элементом нового списка является исходное выражение перед заголовком и аргументамиоцениваются.Затем мы видим, что голова и аргументы оцениваются.Наконец, мы видим выражения верхнего уровня снова после оценки заголовка и аргументов.Последние два элемента списка соответствуют двум элементам исходного вывода трассировки.
Как указано в связанной документации, 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
- и TraceScan
предоставляет больше.