计算
- 如果表达式是一个原始对象(如 Integer、String 等等),则不改变它.
- 计算表达式的头部 h.
- 依次计算表达式的每个元素 ei. 如果 h 是具有属性 HoldFirst、HoldRest、HoldAll 或者 HoldAllComplete 的符号时,则跳过某些元素的计算过程.
- 除非 h 具有属性 SequenceHold 或 HoldAllComplete,否则压平 ei 中出现的所有 Sequence 对象.
- 除非 h 具有属性 HoldAllComplete,否则除去在 ei 中出现的任何 Unevaluated 封装的最外层.
- 如果 h 具有属性 Flat,那么压平所有具有头部 h 的嵌套表达式.
- 如果 h 具有属性 Listable,那么对任何列表 ei 进行线性操作.
- 如果 h 具有属性 Orderless,则按顺序对 ei 进行排列.
- 除非 h 具有属性 HoldAllComplete,否则使用与 f 相关联的适当变换规则,其中 f 是对形如 h[f[e1,…],…] 的对象定义的.
- 对形如 h[f[e1,…],…] 的对象采用与 f 相关联的内置变换规则.
- 采用对 h[f[e1,e2,…],…] 或者 h[…][…] 定义的适当的变换规则.
- 采用 h[e1,e2,…] 或者 h[…][…] 的内置变换规则.
有大量 Wolfram 语言内置函数用特殊方式计算变量. 控制结构 While 就是一个例子. 符号 While 具有属性 HoldAll. 于是,While 的变量不作为标准计算过程的一部分进行计算. 相反地,While 的内部代码采用特殊方式计算变量. 在 While 的情况下,代码重复计算变量,以完成一个循环.
控制结构(Control structures) | 在由控制流决定的序列中计算的变量(如 CompoundExpression) |
条件(Conditionals) | |
逻辑运算(Logical operations) | |
迭代函数(Iteration functions) | |
跟踪函数(Tracing functions) | 从未计算的形式 (如 Trace) |
赋值 | |
纯函数 | 不计算函数体(如 Function) |
作用域结构(Scoping constructs) | |
保持函数(Holding functions) | 变量保持不计算的形式(如 Hold、HoldPattern) |
逻辑操作
在形如 的表达式中, 依次计算. 一旦发现任何 等于 False,计算就停止,并且返回结果 False. 这意味着用户可以使用 来表示程序中的不同“分支”,只有当满足某些条件的时候,才计算一个特定的分支.
迭代函数
迭代函数如 Do[f,{i,imin,imax}] 的计算过程如下:
- 计算 imin 和 imax 的极值.
- 通过使用 Block,把迭代变量 的值设为局部值.
- imin 和 imax 用来决定对迭代变量 i 所赋的值的序列.
- 迭代变量被连续设为每个值,并且在每个情况下计算 f.
- 清除赋给 i 的局部值.
赋值
- 如果左边是一个符号,则不进行计算.
- 如果左边是一个不具有保持不计算属性的函数,则计算函数的变量,但不计算函数本身.
通过使用 Evaluate,可以立即计算函数的任意变量,即使该变量通常在之后的函数的控制下计算. 一个异常情况是当函数具有 HoldAllComplete 属性的时候;在这种情况下,函数的内容不会被修改.
Hold[expr] | 在所有情况下作为 Hold[expr] 处理 |
HoldComplete[expr] | 禁用上值(upvalue),并作为 HoldComplete[expr] 处理 |
HoldForm[expr] | 显示时作为 expr 处理 |
HoldPattern[expr] | 在规则、定义和模式中,作为 expr 处理 |
Unevaluated[expr] | 当变量传递给函数时,作为 expr 处理 |
- 迭代:计算一个特定的表达式直到其不再改变.
- 递归:计算所需的辅助表达式,以找到特定表达式的值.
Trace 把计算链显示为列表,并且显示对应于子列表中的递归的辅助计算.
与辅助计算序列相关联的表达式由 Stack[] 返回的列表给出,这些辅助计算产生当前正在计算的表达式.
$RecursionLimit | 最大迭代深度 |
$IterationLimit | 最大迭代次数 |
通过调用函数 Abort[],或者通过输入合适的中断键,用户可以让 Wolfram 语言在计算中的任意点退出.
当被要求退出时,Wolfram 语言将尽快终止计算. 如果获得的答案是不正确的或者不完整的,那么 Wolfram 语言返回的不是答案而是 $Aborted.