计算

标准计算序列

下面是在计算例如 的表达式的时候,Wolfram 语言所采取的步骤. 每当表达式发生改变时,Wolfram 语言重新开始计算的过程序列.

  • 如果表达式是一个原始对象(如 IntegerString 等等),则不改变它.
  • 计算表达式的头部 h.
  • 如果 h 具有属性 Flat,那么压平所有具有头部 h 的嵌套表达式.
  • 如果 h 具有属性 Listable,那么对任何列表 进行线性操作.
  • 如果 h 具有属性 Orderless,则按顺序对 进行排列.
  • 除非 h 具有属性 HoldAllComplete,否则使用与 f 相关联的适当变换规则,其中 f 是对形如 的对象定义的.
  • 对形如 的对象采用与 f 相关联的内置变换规则.
  • 采用对 或者 定义的适当的变换规则.
  • 采用 或者 的内置变换规则.

非标准变量计算

有大量 Wolfram 语言内置函数用特殊方式计算变量. 控制结构 While 就是一个例子. 符号 While 具有属性 HoldAll. 于是,While 的变量不作为标准计算过程的一部分进行计算. 相反地,While 的内部代码采用特殊方式计算变量. 在 While 的情况下,代码重复计算变量,以完成一个循环.

控制结构(Control structures)在由控制流决定的序列中计算的变量(如 CompoundExpression
条件(Conditionals)只有当采用该变量对应的分支时,才计算的变量(如 IfWhich
逻辑运算(Logical operations)只有当确定逻辑结果需要时,才计算的变量 (如 AndOr
迭代函数(Iteration functions)在迭代的每个步骤中计算的第一个变量(如 DoSumPlot
跟踪函数(Tracing functions)从未计算的形式 (如 Trace
赋值第一个变量只是部分计算 (如 SetAddTo
纯函数不计算函数体(如 Function
作用域结构(Scoping constructs)不计算变量规格(如 ModuleBlock
保持函数(Holding functions)变量保持不计算的形式(如 HoldHoldPattern

用特殊方式计算变量的内置函数.

逻辑操作

在形如 的表达式中, 依次计算. 一旦发现任何 等于 False,计算就停止,并且返回结果 False. 这意味着用户可以使用 来表示程序中的不同分支,只有当满足某些条件的时候,才计算一个特定的分支.

Or 函数与 And 相似;一旦它找到值为 True 的变量,就返回 True. 另一方面,Xor 总是计算所有的变量.

迭代函数

迭代函数如 Do[f,{i,imin,imax}] 的计算过程如下:

  • 计算 的极值.
  • 通过使用 Block,把迭代变量 的值设为局部值.
  • 用来决定对迭代变量 i 所赋的值的序列.
  • 迭代变量被连续设为每个值,并且在每个情况下计算 f.
  • 清除赋给 i 的局部值.

如果有若干个迭代变量,对每个变量和所有之前的变量值依次使用相同的过程处理.

除非特别指明,否则直到对 i 赋以特定的值才计算 f,并且对每个选定的 i 值进行计算. 使用 Evaluate[f] 可以立即计算 f,而不用在一个特定的值被赋给 i 以后才计算.

赋值

赋值的左边只能被部分计算.

  • 如果左边是一个符号,则不进行计算.
  • 如果左边是一个不具有保持不计算属性的函数,则计算函数的变量,但不计算函数本身.

右边被立即计算(),但是没有延时赋值().

出现在赋值左边的形如 HoldPattern[expr] 的任意子表达式没有被计算. 当子表达式用于模式匹配时,虽然它是 expr 而没有 HoldPattern,但是它仍然是匹配的.

重载非标准变量计算

f[,Evaluate[expr],]计算变量 expr,不论 f 是否具有 HoldFirstHoldRest 或者 HoldAll 等保持不计算的属性

重载变量的保持不计算功能.

通过使用 Evaluate,可以立即计算函数的任意变量,即使该变量通常在之后的函数的控制下计算. 一个异常情况是当函数具有 HoldComplete 属性的时候;在这种情况下,函数的内容不会被修改.

避免计算

Wolfram 语言提供了各种不同的函数作为封装(wrappers)来避免计算它们所包含的表达式.

Hold[expr]在所有情况下作为 Hold[expr] 处理
HoldComplete[expr]禁用上值(upvalue),并作为 HoldComplete[expr] 处理
HoldForm[expr]显示时作为 expr 处理
HoldPattern[expr]在规则、定义和模式中,作为 expr 处理
Unevaluated[expr]当变量传递给函数时,作为 expr 处理

避免表达式进行计算的封装(Wrapper).

计算的全局控制

在我们目前讨论过的计算过程中,涉及了两种基本步骤:

  • 迭代:计算一个特定的表达式直到其不再改变.
  • 递归:计算所需的辅助表达式,以找到特定表达式的值.

迭代产生了这样的计算链:其中通过使用各种不同的变换规则,得到连续的表达式.

Trace 把计算链显示为列表,并且显示对应于子列表中的递归的辅助计算.

与辅助计算序列相关联的表达式由 Stack[] 返回的列表给出,这些辅助计算产生当前正在计算的表达式.

$RecursionLimit最大迭代深度
$IterationLimit最大迭代次数

控制表达式计算的全局变量.

退出

通过调用函数 Abort[],或者通过输入合适的中断键,用户可以让 Wolfram 语言在计算中的任意点退出.

当被要求退出时,Wolfram 语言将尽快终止计算. 如果获得的答案是不正确的或者不完整的,那么 Wolfram 语言返回的不是答案而是 $Aborted.

可以使用 CheckAbort 来捕获退出,并且使用 AbortProtect 获得延迟.