此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

2.5.11 高级专题:计算堆栈

在计算过程中,Mathematica 保持一个包含当前计算的表达式的计算堆栈. 可以用 Stack 函数查看堆栈的内容.在中途中断了计算之后,就能用 Stack 函数来看 Mathematica 做什么.
Mathematica 先计算的总是堆栈中的最后一个元素,前面的元素正在计算之中. 因此,正在计算x时,与 f [g[x]] 计算相关的堆栈为  f [g[x]], g[x], x .

Stack[_] ]给出了调用时正在被计 算的表达式,这里包括了 Print 函数

Stack[ ] 给出了调用时与计算有关的标识符

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

观察计算堆栈

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

阶乘函数的递推定义

计算 fac[10],当遇到 fac[4] 开始对话

这里显示了对话开始时正在计算的对象

退出对话,并给出最终结果

在简单情况下,计算堆栈用来记录当前正在计算的所有表达式,但有时这样不 方便,例如执行 Print[Stack[ ]] 总是显示堆栈,其中 Print 是最后一个函数. 函数 StackInhibit 可以避免这种问题,StackInhibit[expr]  ,但不改变堆栈的内容.

StackInhibit 禁止 Print 被包含在堆栈之中

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

计算堆栈的控制

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

在计算 expr 时使用新堆栈

Stack 一般只显示正在计算的表达式,所以它包括每个表达的最新形式, 有时也需要查看表达式以前的形式,这可以用 StackComplete 来实现. StackComplete[ ] 可以记录当前正在计算的表达式的完整计算链, 此时堆栈与设置了 TraceBackward -> AllTraceAbove->TrueTrace 得到的表达式序列相对应.