評価

標準の評価手順

Wolfram言語は の形式の式の評価を以下の手順で行う.式が変化するごとに,同じ手順による評価処理が行われる.

  • 式が基本的なオブジェクト(IntegerString等)のときは,そのままにしておく.
  • 式の頭部 h を評価する.
  • hSequenceHoldの属性がない限り,要素 中のSequenceオブジェクトを平坦化する.
  • hFlatの属性があるならば,頭部 h についてネストしている式をすべて平坦化する.
  • hListableの属性があるならば,リストの要素 のそれぞれに対して分配する.
  • hOrderlessの属性があるならば,成分 を順番に並べる.
  • hHoldAllCompleteの属性がない限り,形式のオブジェクトについて定義された,f に関する変換規則で可能なものはすべて適用する.
  • 形式のオブジェクトに,f に関する組込み変換規則を適用する.
  • または について定義された変換規則で可能なものを適用する.
  • または について組込みの変換規則を適用する.

非標準的な引数の評価

いくつかの組込み関数は,引数の評価を特殊な手順で行う.制御構文であるWhileがその例である.Whileは属性HoldAllを持つので,Whileの引数は標準では評価されない.代りに,Whileの内部のコードが引数を特殊な方法で評価する.Whileの場合,ループ構造を形成するために引数が繰り返し評価される.

制御構文制御の流れにより決定される順番で引数が評価される(例:CompoundExpression
条件子対応した分岐先が選択されたときだけに引数が評価される(例:IfWhich
論理演算子論理式の評価結果の解釈に必要とされるときだけ引数が評価される(例:AndOr
反復関数反復操作における各ステップで第1引数が評価される(例:DoSumPlot
トレース関数評価しない(例:Trace
割当て第1引数が部分的に評価される(例:SetAddTo
純関数関数の本体は評価されない(例:Function
スコープ構文変数指定の部分は評価されない(例:ModuleBlock
評価保留関数引数は評価されないまま保持される(例:HoldHoldPattern

引数が特殊な評価を受ける組込み関数

論理演算

形式の式が入力されると,その条件成分 は並び順に従って評価される. のいずれかが成り立たない場合は(つまり,Falseになるとき)評価が停止し,結果としてFalseが返される.つまり, を特定の条件が成立するときにのみ,ある式が評価されるような「分岐」に使うことができる,ということを意味する.

関数OrAnd同様に働く.Orは引数が1つでもTrueであった時点でTrueを返す.これに対し,Xorは常にすべての引数を評価する.

反復関数

Do[f,{i,imin,imax}]等の反復関数は下記の手順で評価される.

  • 極限 が評価される.
  • Blockが使用され,反復変数 を局所的なものとする.
  • パラメータ をもとに反復変数 i の取る値を決定する.
  • 反復変数の値が各反復ごとに設定され,その都度 f が評価される.
  • i に割り当てた局所値を消去する.

複数の反復変数があるとき,上述の手順がそれぞれの変数について,より高順位のすべての変数のそれぞれの値に対して順番に適用される.

特に指定がない場合,特定の値が i に割り当てられるまで f の評価は行われない.また,評価は i が新たな値を取るたびに行われる.Evaluate[f]を使うと,特定の値が i に割当てられた後だけではなく,直ちに f を評価することができる

割当て

割当て式の左辺は部分的にしか評価されない.

  • 左辺が単一のシンボルのとき,評価は行われない.
  • 左辺がホールド属性を持たない関数のときは,関数の引数は評価するが,関数自体は評価しない.

式の右辺は,式が即時型()であれば評価されるし,また,遅延型()であれば評価されない.

割当て式の左辺にHoldPattern[expr]形式の部分式があるとき,それは評価されない.その式がパターンマッチングに使われる場合は,HoldPatternのない expr であるかのようにマッチする.

非標準の引数評価における強制評価

f[,Evaluate[expr],]f に引数評価を保留にする属性HoldFirstHoldRestHoldAllがあっても,引数 expr を評価する

評価が保留される引数の強制評価

関数の機構により評価が後回しになる引数についてもEvaluateを引数に適用することで,評価を直ちに行わせることができる.しかし,関数がHoldComplete属性を持つ場合は例外である.個の場合,関数の内容は評価体により変更されない.

評価の禁止

Wolfram言語には式を「包み込んで」評価を抑制するためにさまざまな関数が用意されている.

Hold[expr]常にHold[expr]として扱う
HoldComplete[expr]上向きの値を使用禁止とした上でHoldComplete[expr]として扱う
HoldForm[expr]表示では expr として扱う
HoldPattern[expr]規則,定義,パターンでは expr として扱う
Unevaluated[expr]引数が関数に渡されるときは,単なる expr として扱う

式の評価を抑制する機能を持つ頭部

評価処理の大域的な制御

上記の評価手順には次の2つの基本処理ステップがある.

  • 反復:特定の式を変化がなくなるまで繰り返し評価する.
  • 再帰:ある式の値を得るために必要になる副次的な式を評価する.

反復処理は,評価の列を発生し,そこでは各種の変換規則が適用され,一連の式が得られる.

Traceは評価の列をリストとして表示する.また再帰に対応して生じる副次的な評価をサブリストの形式で表示する.

現在評価しようとしている式の値を得るための一連の副次的評価に関連した式は,Stack[]によりリストの形で得られる.

$RecursionLimit最大再帰深度
$IterationLimit最大反復回数

式の評価処理を制御するための大域変数

放棄

関数Abort[]を呼ぶか,割込み用のキーを押すことで,どんなときでもWolfram言語に計算の放棄を要求できる.

放棄の要求があったなら,Wolfram言語は進行中の計算をできる限り早く停止させようとする.その際,計算で得られた値が正しくなく,不完全である場合,答を破棄し,$Abortedを返す.

AbortProtectにより放棄を延期させることができる.その際,CheckAbortにより放棄の要請が発生したかどうかをチェックすることができる.