信息
Mathematica 有处理计算中所产生信息的机制. 许多 Mathematica 内部函数用这种机制产生错误和警告信息. 这种机制可以用于自定义函数的信息.
基本思想是每条信息有一个确定的名称,形式为
. 可以用这些名称指代信息(对象
的头部为 MessageName.)
| Quiet[expr] | 计算 expr 不显示任何信息 |
| Quiet[expr,{s1::tag,s2::tag,...}] | 计算 expr 不显示指定的信息 |
| Off[s::tag] | 关闭信息使其不显示 |
| On[s::tag] | 打开信息 |
控制信息的显示.
如 "提示和信息"所示,可以用 Quiet 控制显示特别的信息. 默认情况下,大部分内部函数的有关信息是打开的. 可以使用 Off 永久关闭信息.
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
可以使用 On 和 Off 全局改变特殊信息的显示. 可以用 Off 关闭不想看的信息.
| Out[5]= |  |
尽管大部分与内部函数有关的信息默认是打开的,但也有些是关闭的,要明确打开才能显示. 一个例子是信息 General::newsym,详见 "拦截新符号的产生", 任何新符号产生时它会显示一个信息.
| s::tag | 给出信息内容 |
| s::tag=string | 设置信息内容 |
| Messages[s] | 显示与 s 相关的信息 |
信息的操作.
名为
的信息内容作为
的值存放,与符号 s 相联系. 可以简单地用
查看该信息. 也可以通过对
赋值设置信息.
| Out[6]= |  |
| Out[7]= |  |
| Out[8]= |  |
| Out[9]= |  |
信息总是以适用于 StringForm 的字符串存放. 当需要显示时,一些相应的表达式就拼接成该信息. 这些表达式用HoldForm 封装,以防止它被计算. 此外,任何被指定为全局变量 $MessagePrePrint 的函数在它们被交给 StringForm 之前作用于这些表达式. $MessagePrePrint 默认使用 Short 作为文本格式,并且组合 Short 和Shallow 来排版.
大部分信息与产生它们的函数有关. 但也有一些"一般"信息,各种函数都产生这种信息.
当给函数 F 的变量数目不正确时,Mathematica 将显示警告信息诸如, F::argx. 如果 Mathematica 找不到命名为 F::argx 的信息时,它就用"一般"信息 General::argx 代替. 可以用 Off[F::argx] 关闭对函数 F 的变量计数的信息,也可以用 Off[General::argx] 关闭所有使用一般信息文本的信息.
当对内部函数给出的变量个数有误时,
Mathematica 就显示一个信息.
| Out[10]= |  |
这个自变量计数信息是一个一般信息,许多函数都使用它.
| Out[11]= |  |
屏蔽 Sqrt::argx 仅压缩由 Sqrt 函数产生的信息,不是由其它函数产生的.
| Out[12]= |  |
屏蔽 General::argx 压缩所有使用 General::argx 的信息.
这里,没有显示

信息.
| Out[13]= |  |
如果
信息没有使用 General::tag,压缩 General::tag 不会压缩
. 比如,关掉 General::targ 信息不会关掉 Entropy::targ 信息,因为两个信息是不一样的.
| Out[14]= |  |
| Out[15]= |  |
| Out[16]= |  |
当计算中出现严重错误时,就会发现同样的警告信息反复产生. 这会导致混乱. 于是 Mathematica 就跟踪一个计算过程中的所有信息, 当一条信息重复出现多于3次时就不再显示它. 当这一情况发生时,Mathematica 就显示信息 General::stop 去提醒用户. 如果需要查看所有 Mathematica 显示的信息,就要关闭 General::stop.
找出计算过程中所产生的信息.
在每一个计算中, Mathematica 将所产生的全部信息放在列表 $MessageList 中. 在标准的 Mathematica 进程中,每一行的输出产生后就清除这个信息列表,但在计算过程中可以访问这个列表. 另外,在一个进程中第 n
行的输出产生时,$MessageList 的值就赋给 MessageList[n].
Out[18]//InputForm= |
| |  |
在编辑时需要自动知道一个计算过程中是否产生了信息. 如果产生的信息告知生成了一些不确定的数值结果,那么计算的结果可能就失去了意义.
| Check[expr,failexpr] | 当计算 expr 时没有产生信息,则返回值 expr; 否则返回 failexpr |
| Check[expr,failexpr,s1::t1,s2::t2,...] | 仅检查信息    |
检查警告信息.
计算

时不产生信息,返回值就是计算结果.
| Out[19]= |  |
计算

时产生信息,所以返回值是
Check 的第 2 个变量.
| Out[20]= |  |
Check[expr, failexpr] 测试实际显示的所有信息. 并不测试用 Off 关闭的信息.
有时仅需要测试某一些特定信息,如与数值溢出有关的信息,这就需要告诉 Check 所需要测试的信息名.
| Out[21]= |  |
产生信息.
用 Message 函数可以模仿内部函数产生信息的各种方式. 用 On 和 Off 打开或关闭信息, Message 找不到指定信息
时就自动寻找 General::tag.
这里定义了与

有关的信息内容.
| Out[22]= |  |
这里给出函数

.
当

的变量大于10时就产生信息.
| Out[24]= |  |
| Out[26]= |  |
调用 Message 时,它先找指定名称的信息,找不到时它找一个与 General 符号相关的比较合适的信息名. 再找不到时 ,Mathematica 就将你所定义的任意函数作全局变量 $NewMessage 的值,且将该函数作用到你所要求信息的符号和标记上.
通过对 $NewMessage 的适当设置,当第一次需要一个信息时,就可以让 Mathematica 从一个文件读入信息内容.