Mathematica 9 is now available

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 得到的表达式序列相对应.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.