计算
标准计算序列
下面是在计算例如
的表达式的时候,Mathematica 所采取的步骤. 每当表达式发生改变时,Mathematica 重新开始计算的过程序列.
非标准变量计算
有大量 Mathematica 内置函数用特殊方式计算变量. 控制结构 While 就是一个例子. 符号 While 具有属性 HoldAll. 于是,While 的变量不作为标准计算过程的一部分进行计算. 相反地,While 的内部代码采用特殊方式计算变量. 在 While 的情况下,代码重复计算变量,以完成一个循环.
| 控制结构(Control structures) | 在由控制流决定的序列中计算的变量(如 CompoundExpression) |
| 条件(Conditionals) | 只有当采用该变量对应的分支时,才计算的变量(如 If、Which) |
| 逻辑运算(Logical operations) | 只有当确定逻辑结果需要时,才计算的变量 (如 And、Or) |
| 迭代函数(Iteration functions) | 在迭代的每个步骤中计算的第一个变量(如 Do、Sum、Plot) |
| 跟踪函数(Tracing functions) | 从未计算的形式 (如 Trace) |
| 赋值 | 第一个变量只是部分计算 (如 Set、AddTo) |
| 纯函数 | 不计算函数体(如 Function) |
| 作用域结构(Scoping constructs) | 不计算变量规格(如 Module、Block) |
| 保持函数(Holding functions) | 变量保持不计算的形式(如 Hold、HoldPattern) |
逻辑操作
在形如
的表达式中,
依次计算. 一旦发现任何
等于 False,计算就停止,并且返回结果 False. 这意味着用户可以使用
来表示程序中的不同"分支",只有当满足某些条件的时候,才计算一个特定的分支.
Or 函数与 And 相似;一旦它找到值为 True 的变量,就返回 True. 另一方面,Xor 总是计算所有的变量.
迭代函数
迭代函数如 Do[f, {i, imin, imax}] 的计算过程如下:
如果有若干个迭代变量,对每个变量和所有之前的变量值依次使用相同的过程处理.
除非特别指明,否则直到对 i 赋以特定的值才计算 f,并且对每个选定的 i 值进行计算. 使用 Evaluate[f] 可以立即计算 f,而不用在一个特定的值被赋给 i 以后才计算.
赋值
出现在赋值左边的形如 HoldPattern[expr] 的任意子表达式没有被计算. 当子表达式用于模式匹配时,虽然它是 expr 而没有 HoldPattern,但是它仍然是匹配的.
重载非标准变量计算
通过使用 Evaluate,可以立即计算函数的任意变量,即使该变量通常在之后的函数的控制下计算. 一个异常情况是当函数具有 HoldComplete 属性的时候;在这种情况下,函数的内容不会被修改.
避免计算
Mathematica 提供了各种不同的函数作为封装("wrappers")来避免计算它们所包含的表达式.
| Hold[expr] | 在所有情况下作为 Hold[expr] 处理 |
| HoldComplete[expr] | 禁用上值(upvalue),并作为 HoldComplete[expr] 处理 |
| HoldForm[expr] | 显示时作为 expr 处理 |
| HoldPattern[expr] | 在规则、定义和模式中,作为 expr 处理 |
| Unevaluated[expr] | 当变量传递给函数时,作为 expr 处理 |
计算的全局控制
迭代产生了这样的计算链:其中通过使用各种不同的变换规则,得到连续的表达式.
Trace 把计算链显示为列表,并且显示对应于子列表中的递归的辅助计算.
与辅助计算序列相关联的表达式由 Stack[] 返回的列表给出,这些辅助计算产生当前正在计算的表达式.
| $RecursionLimit | 最大迭代深度 |
| $IterationLimit | 最大迭代次数 |
退出
通过调用函数 Abort[],或者通过输入合适的中断键,用户可以让 Mathematica 在计算中的任意点退出.
当被要求退出时,Mathematica 将尽快终止计算. 如果获得的答案是不正确的或者不完整的,那么 Mathematica 返回的不是答案而是 $Aborted.
可以使用 CheckAbort 来捕获退出,并且使用 AbortProtect 获得延迟.
