メッセージ
計算時に発生するメッセージはすべて一般規定に基づいて処理される.組込み関数の多くがこの一般規定を使いエラーや警告用メッセージを生成している.ユーザ定義の関数についてもこの規定に基づいてメッセージを構築できるようになっている.
メッセージ構築の基本は,
の形式でメッセージに固有の名前を与えることである.メッセージの参照はすべてこの名前を使う(
はオブジェクトであり,その頭部は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がかけられ評価保留になる.また,StringFormで式が代入処理される前に,メッセージ表示の前処理関数指定の大域変数$MessagePrePrintに割り付けられている関数があれば式に適用される.$MessagePrePrintのデフォルトでは,テキストのフォーマットにはShortが,タイプセットにはShortとShallowの組合せが使われる.
メッセージのほとんどはそれを使う関数に密着した内容になっている.これに対して,特定の関数には直接関連付けされない「一般的な」メッセージもある.
関数 F に必要な数の引数を与えなかったら,F::argxに登録されている警告メッセージが表示される.もし F::argxに何も登録されていなければ,引数不正に関する「一般的な」メッセージ,General::argxが表示されることになっている.また,Off[F::argx]と入力しておけば,F に関する引数警告メッセージだけを表示禁止にできる.さらに,Off[General::argx]と入力しておくと,引数警告用の一般メッセージを表示禁止にする.
多すぎる引数を入力する.引数の数が不正という警告文が表示される.
| Out[10]= |  |
引数の数が不正というメッセージは一般的なもので,実際,多くの関数で使われる.
| Out[11]= |  |
Sqrt::argxにQuietを使うことでSqrt関数により発せられるメッセージを非表示にできるが,他の関数により発せられるものは非表示にはできない.
以下は
Sin::argxメッセージを出力するが
Sqrt::argxは出力しない.
| Out[12]= |  |
General::argxを無効にすると,General::argxを使うメッセージすべてが表示されなくなる.
ここでは

メッセージが出力されない.
| Out[13]= |  |
メッセージが General::tag を使っていないとき,General::tag を非表示にしても
は非表示にならない.例えば,General::targメッセージを無効にしてもEntropy::targメッセージは無効にならない.それはこの2つのメッセージが同じものではないからである.
| Out[14]= |  |
| Out[15]= |  |
| Out[16]= |  |
計算処理がうまくいかないと,よく警告メッセージが何回も表示される.同じことを繰り返して表示してもあまり意味がないし,かえって,混乱させてしまうだろう.そこで,計算中に発生したメッセージはすべて Mathematica 内部に一時貯めこまれ,同じメッセージが3回連続して発生した場合,次からの表示が禁止になる.この事態が起ると,一般形メッセージGeneral::stopが表示されるようになっている.すべてのメッセージが見たい場合はGeneral::stopをオフにしておく.
計算セッションで発生したメッセージの再確認
Mathematica の内部には$MessageListの名前でリストスペースが確保され,計算が行われるたびに処理中に発生するメッセージがすべて記録される.標準設定の計算セッションでは,このリストは新たな出力行が生成された時点でクリアされてしまう.それでも,計算中にこのリストを参照することができる.また,n 番目の出力行が生成されるときには,最終メッセージリスト$MessageListの内容がコピーされMessageList[n]として別に保管される.
メッセージの名前には
HoldFormがかけられているので,評価の対象にはならない.
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の引数に検出したいメッセージの名前を指定しておく.
Sin[1, 2]の計算で発生するメッセージは
Checkでは無視される.指定したメッセージではないからである.
| Out[21]= |  |
| Message[s::tag] | メッセージの内容文を表示する |
| Message[s::tag,expr1,...] | メッセージに式 を代入して構成した文を表示する |
メッセージの表示
メッセージ関数Messageを使い組込み関数の行うメッセージ出力の詳細を再現することができる.例えば,OnとOff関数を使い関数のメッセージ表示をオン・オフし,もし,あるとき,メッセージ
が表示禁止になっていたら,Messageが自動的に一般メッセージGeneral::tag を返してくれる.

がオーバーフローを起したときに表示するメッセージの内容を定義しておく.
| Out[22]= |  |
関数

を定義する.

の引数が10より大きいのでオーバーフロー状態になり,メッセージが表示される.
| Out[24]= |  |
| Out[26]= |  |
Messageの動作ステップとして,まず,指定した名前(頭部とタグ)のメッセージが検索される.見付からないときは,指定タグに関連した記号Generalのメッセージが検索される.それもない場合は,$NewMessageの大域変数に割り付けられている関数を参照し,指定頭部とタグを引数として同関数を適用する.
$NewMessageを適当に設定しておくことで,例えば,特定のメッセージについて,それがはじめて必要になったときにはファイルからメッセージ文を読み込むようにすることも可能である.