2.5.5 非标准计算大部分 Mathematica 内部的函数按标准过程进行计算,但也有些重要的函数不 遵循这一原则. 例如 Mathematica 中与程序的构造和执行有关的函数就使用 非标准计算过程. 典型的情况是这些函数或者不计算它们的一些变量的值, 或者按一种特殊的方法计算. 使用非标准计算过程的一些函数 当给出 a=1 的定义时,Mathematica 并不计算左端 a 的值. 如果计算将会导致 麻烦,其原因是在前面已定义了 a=7, 又要在 a=1 中计算 a,这就导致了 7=1 的矛盾. 在标准计算过程中,函数的每个变量是逐个计算的,可以通过属性 HoldFirst, HoldRest 和 HoldAll 来改变这种情况,这些属性使某些变量处于不计算的状态. 保持函数变量不被计算的属性 标准计算过程中的所有变量都计算
Out[1]= |  |
给 h 设置属性 HoldFirst 不计算 h 的第一个变量
Out[3]= |  |
用到 h 的第一个变量时进行计算
Out[4]= |  |
内部函数如 Set 有 HoldFirst 等属性
Out[5]= |  |
即使一个函数具有使其某些变量保持不计算状态的属性,还可以用 Evaluate[arg] 的形式来告诉 Mathematica 去计算它们. Evaluate 有效地屏蔽了 HoldFirst 属性,使第一个变量被计算
Out[6]= |  |
强行计算函数的变量 保持变量可以使函数控制其变量在什么时候被计算.通过使用 Evaluate 可立即计算变量的值,而不再由函数控制这些变量的计算. 这一功能在许多情况下是有用的. 例如在画图内,Plot 函数保持表达式的 值不计算,随后在一系列数值点上计算该表达式的值. 有时需要立即计算 表达式的值并画图,例如有时要画由Table 产生的几个函数的图, 这不需要在绘制每个点时, Table 进行运算,而是需要 Table 立即进行运算. Evaluate 导致这些函数立即成立,而不是在 Plot 选择的 x 值点列上成立
Out[7]= |  |
Plot 等内部函数能保持它们的变量不立即计算,但可以使用 Evaluate 去改变这一属性. Set 函数保持第一个变量故此时 a 不计算
Out[8]= |  |
用 Evaluate 使 Set 计算它的第一个变量
Out[9]= |  |
此时 b=6
Out[10]= |  |
大部分情况下需要计算表达式,有时也需要某些表达式不计算,例如对 Mathematica 的一个程序块进行符号处理时,就要防止在处理过程中它们被计算. 用函数 Hold 和 HoldForm 保持表达式不计算.这些函数就是设置 HoldAll 属性或 提供一种包装,使表达式处于不计算状态. Hold ] 和 HoldForm[ ] 的区别在于 Mathematica 的输出格式,Hold 可以直接显示,而 HoldForm 不直接显示, 通过查看 Mathematica 的完全内部形式,就可以看到这两个函数. Hold 保持表达式不计算
Out[11]= |  |
HoldForm 也保持表达式不计算,但标准输出中显示它
Out[12]= |  |
HoldForm 在内部形式中仍出现 Out[13]//FullForm=
 |
ReleaseHold 函数删除 Hold 和 HoldForm,因此对该表达式进行了计算
Out[14]= |  |
处理不计算表达式的函数 通常选取表达式的项时就计算它
Out[15]= |  |
取出表达式的项,并用 Hold 包装,使它不被计算
Out[16]= |  |
最后一个变量 1 告诉 ReplacePart 在插入之前取出第一项
Out[17]= |  |
暂时防止变量求值 1+1 得 2, Length[2] 的结果是 0
Out[18]= |  |
1+1 不计算作为 Length 的变量
Out[19]= |  |
Unevaluated[ ] 暂时给函数设置类似于 HoldFirst 的属性,并将 作为函数的变量. 防止计算其它属性 HoldAll 属性可以保持函数的变量不被计算,但 Mathematica 还可以对变量进行变换, 使用 SequenceHold 属性,可以防止变量中出现的序列被压平. 通过设置 HoldAllComplete 属性, 可以防止保持的变量被计算和与变量有关的上值被使用.
|