计算堆栈

在计算过程中,Mathematica 保持一个包含当前计算的表达式的计算堆栈. 可以用 Stack 函数查看堆栈的内容. 这意味着,例如,在 Mathematica 中途中断了计算之后,就能用 Stack 函数来看 Mathematica 做什么.

Mathematica 先计算的总是堆栈中的最后一个元素,前面的元素正在计算之中.

因此,正在计算 x 时,与 相关的堆栈为 .

Stack[_] 给出了调用时正在被计算的表达式,这里包括了 Print 函数.
Stack[] 给出了调用时与计算有关的标识符.

一般地,可以把计算堆栈看作显示在计算过程中 Mathematica 调用的函数所在的位置. 用 TraceAbove 设置为 True 的选项,在 Trace 返回的嵌套列中的第一个元素与这个表达式序列相对应.

Stack[]给出一个与正在进行的计算有关的标识符列表
Stack[_]给出当前正在计算的表达式列表
Stack[form]仅包括与 form 匹配的表达式

观察计算堆栈.

Mathematica 主进程中很少直接调用 Stack. 通常是在计算过程的中间调用 Stack. 典型的情况是在对话中、在辅助进程中调用,这将在 "对话" 节中讨论.

阶乘函数的递推定义.
In[3]:=
Click for copyable input
计算 ,当遇到 开始对话.
In[4]:=
Click for copyable input
Out[4]=
这里显示了对话开始时,正在计算的对象.
In[5]:=
Click for copyable input
Out[5]=
退出对话,并给出最终结果.
In[6]:=
Click for copyable input
Out[6]=

在简单情况下,Mathematica 计算堆栈用来记录当前正在计算的所有表达式,但有时这样不方便. 例如,执行Print[Stack[]] 总是显示堆栈,其中 Print 是最后一个函数.

函数 StackInhibit 可以避免这种问题,StackInhibit[expr] 计算表达式 expr,但不改变堆栈的内容.

StackInhibit 禁止 Print 被包含在堆栈之中.
In[7]:=
Click for copyable input
Out[7]=

TraceDialog 等函数在开始一个对话时,自动调用 StackInhibit,即 Stack 不显示在对话过程中调用的函数,只显示外面的函数.

StackInhibit[expr]计算 expr,不修改stack
StackBegin[expr]计算 expr,刷新堆栈
StackComplete[expr]计算 expr,将计算链中的表达式包含在堆栈之中

计算堆栈的控制.

使用 StackInhibitStackBegin 时,可以控制将计算过程中某一部分记录在堆栈之中. StackBegin[expr] 计算 expr,刷新堆栈意味着在计算 expr 的过程中,堆栈不包含 StackBegin 外的其它内容. TraceDialog[expr, ...] 等函数在计算 expr 之前调用 StackBegin,所以堆栈显示 expr 的计算过程,而不显示 TraceDialog 的调用过程.

在计算 expr 时,StackBegin[expr] 使用新堆栈.
In[8]:=
Click for copyable input
Out[8]=

Stack 一般只显示正在计算的表达式,所以它包括每个表达式的最新形式,有时也需要查看表达式以前的形式,这可以用StackComplete 实现.

StackComplete[expr] 可以记录当前正在计算的表达式的完整计算链,此时堆栈与设置了TraceBackward->AllTraceAbove->TrueTrace 得到的表达式序列相对应.

New to Mathematica? Find your learning path »
Have a question? Ask support »