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

2.5.5 非标准计算

大部分 Mathematica 内部的函数按标准过程进行计算,但也有些重要的函数不 遵循这一原则. 例如 Mathematica 中与程序的构造和执行有关的函数就使用 非标准计算过程. 典型的情况是这些函数或者不计算它们的一些变量的值, 或者按一种特殊的方法计算.

使用非标准计算过程的一些函数

当给出 a=1 的定义时,Mathematica 并不计算左端 a 的值. 如果计算将会导致 麻烦,其原因是在前面已定义了 a=7, 又要在 a=1 中计算 a,这就导致了 7=1 的矛盾.
在标准计算过程中,函数的每个变量是逐个计算的,可以通过属性 HoldFirst, HoldRestHoldAll 来改变这种情况,这些属性使某些变量处于不计算的状态.

保持函数变量不被计算的属性

标准计算过程中的所有变量都计算

h 设置属性 HoldFirst

不计算 h 的第一个变量

用到 h 的第一个变量时进行计算

内部函数如 SetHoldFirst 等属性

即使一个函数具有使其某些变量保持不计算状态的属性,还可以用 Evaluate[arg] 的形式来告诉 Mathematica 去计算它们.

Evaluate 有效地屏蔽了 HoldFirst 属性,使第一个变量被计算

强行计算函数的变量

保持变量可以使函数控制其变量在什么时候被计算.通过使用 Evaluate 可立即计算变量的值,而不再由函数控制这些变量的计算. 这一功能在许多情况下是有用的. 例如在画图内,Plot 函数保持表达式的 值不计算,随后在一系列数值点上计算该表达式的值. 有时需要立即计算 表达式的值并画图,例如有时要画由Table 产生的几个函数的图, 这不需要在绘制每个点时, Table 进行运算,而是需要 Table 立即进行运算.

Evaluate 导致这些函数立即成立,而不是在 Plot 选择的 x 值点列上成立

Plot 等内部函数能保持它们的变量不立即计算,但可以使用 Evaluate 去改变这一属性.

Set 函数保持第一个变量故此时 a 不计算

Evaluate 使 Set 计算它的第一个变量

此时 b=6

大部分情况下需要计算表达式,有时也需要某些表达式不计算,例如对 Mathematica 的一个程序块进行符号处理时,就要防止在处理过程中它们被计算. 用函数 HoldHoldForm 保持表达式不计算.这些函数就是设置 HoldAll 属性或 提供一种包装,使表达式处于不计算状态. Hold ] 和 HoldForm[ ] 的区别在于 Mathematica 的输出格式,Hold 可以直接显示,而 HoldForm 不直接显示, 通过查看 Mathematica 的完全内部形式,就可以看到这两个函数.

Hold 保持表达式不计算

HoldForm 也保持表达式不计算,但标准输出中显示它

HoldForm 在内部形式中仍出现

Out[13]//FullForm=

ReleaseHold 函数删除 HoldHoldForm,因此对该表达式进行了计算

处理不计算表达式的函数

通常选取表达式的项时就计算它

取出表达式的项,并用 Hold 包装,使它不被计算

最后一个变量 1 告诉 ReplacePart 在插入之前取出第一项

暂时防止变量求值

1+12, Length[2] 的结果是 0

1+1 不计算作为 Length 的变量

Unevaluated[ ] 暂时给函数设置类似于 HoldFirst 的属性,并将  作为函数的变量.

防止计算其它属性

HoldAll 属性可以保持函数的变量不被计算,但 Mathematica 还可以对变量进行变换, 使用 SequenceHold 属性,可以防止变量中出现的序列被压平. 通过设置 HoldAllComplete 属性, 可以防止保持的变量被计算和与变量有关的上值被使用.