評価
標準の評価手順
Mathematica は
の形式の式の評価を以下の手順で行う.式が変化するごとに,同じ手順による評価処理が行われる.
非標準的な引数の評価
いくつかの組込み関数は,引数の評価を特殊な手順で行う.制御構文であるWhileがその例である.Whileは属性HoldAllを持つので,Whileの引数は標準では評価されない.代りに,Whileの内部のコードが引数を特殊な方法で評価する.Whileの場合,ループ構造を形成するために引数が繰り返し評価される.
| 制御構文 | 制御の流れにより決定される順番で引数が評価される(例:CompoundExpression) |
| 条件子 | 対応した分岐先が選択されたときだけに引数が評価される(例:If, Which) |
| 論理演算子 | 論理式の評価結果の解釈に必要とされるときだけ引数が評価される(例:And,Or) |
| 反復関数 | 反復操作における各ステップで第1引数が評価される(例:Do,Sum,Plot) |
| トレース関数 | 評価しない(例:Trace) |
| 割当て | 第1引数が部分的に評価される(例:Set,AddTo) |
| 純関数 | 関数の本体は評価されない(例:Function) |
| スコープ構文 | 変数指定の部分は評価されない(例:Module,Block) |
| 評価保留関数 | 引数は評価されないまま保持される(例:Hold,HoldPattern) |
論理演算
形式の式が入力されると,その条件成分
は並び順に従って評価される.
のいずれかが成り立たない場合は(つまり,Falseになるとき)評価が停止し,結果としてFalseが返される.つまり,
を特定の条件が成立するときにのみ,ある式が評価されるような「分岐」に使うことができる,ということを意味する.
関数OrもAnd同様に働く.Orは引数が1つでもTrueであった時点でTrueを返す.これに対し,Xorは常にすべての引数を評価する.
反復関数
Do[f, {i, imin, imax}]等の反復関数は下記の手順で評価される.
複数の反復変数があるとき,上述の手順がそれぞれの変数について,より高順位のすべての変数のそれぞれの値に対して順番に適用される.
特に指定がない場合,特定の値が i に割り当てられるまで f の評価は行われない.また,評価は i が新たな値を取るたびに行われる.Evaluate[f]を使うと,特定の値が i に割当てられた後だけではなく,直ちに f を評価することができる
割当て
式の右辺は,式が即時型(
)であれば評価されるし,また,遅延型(
)であれば評価されない.
割当て式の左辺にHoldPattern[expr]形式の部分式があるとき,それは評価されない.その式がパターンマッチングに使われる場合は,HoldPatternのない expr であるかのようにマッチする.
非標準の引数評価における強制評価
関数の機構により評価が後回しになる引数についてもEvaluateを引数に適用することで,評価を直ちに行わせることができる.しかし,関数がHoldComplete属性を持つ場合は例外である.個の場合,関数の内容は評価体により変更されない.
評価の禁止
Mathematica には式を「包み込んで」評価を抑制するためにさまざまな関数が用意されている.
| Hold[expr] | 常にHold[expr]として扱う |
| HoldComplete[expr] | 上向きの値を使用禁止とした上でHoldComplete[expr]として扱う |
| HoldForm[expr] | 表示では expr として扱う |
| HoldPattern[expr] | 規則,定義,パターンでは expr として扱う |
| Unevaluated[expr] | 引数が関数に渡されるときは,単なる expr として扱う |
評価処理の大域的な制御
反復処理は,評価の列を発生し,そこでは各種の変換規則が適用され,一連の式が得られる.
Traceは評価の列をリストとして表示する.また再帰に対応して生じる副次的な評価をサブリストの形式で表示する.
現在評価しようとしている式の値を得るための一連の副次的評価に関連した式は,Stack[]によりリストの形で得られる.
| $RecursionLimit | 最大再帰深度 |
| $IterationLimit | 最大反復回数 |
放棄
関数Abort[]を呼ぶか,割込み用のキーを押すことで,どんなときでも Mathematica に計算の放棄を要求できる.
放棄の要求があったなら,Mathematica は進行中の計算をできる限り早く停止させようとする.その際,計算で得られた値が正しくなく,不完全である場合,答を破棄し,$Abortedを返す.
AbortProtectにより放棄を延期させることができる.その際,CheckAbortにより放棄の要請が発生したかどうかをチェックすることができる.
