評価処理用スタック
Mathematica 内部には「評価スタック」と呼ばれる現在評価中の式を記録しておく場所が用意されている.関数Stackを使うと,そのスタックの記録内容を参照できる.計算を一時停止させたとき等にStackを実行し計算の状態がどうなっているか調べることができる.
評価スタックにおける式は,最も最近評価された式がスタックの最後の式となるように並べられる.すでに評価が進行している式は,スタックの先頭寄りに置かれる.
例えば,式
の評価において,現時点で x が評価されているとする.スタックを参照すると
の順序で評価が進んでいる旨が表示される.
評価スタックは,特定の計算において Mathematica の現在位置に到達するまでに,どの関数がどの他の関数を呼び出したかを表示してくれるものととらえることができる.こうして表示される式の列は,オプションTraceAboveをTrueとしたときのTrace関数により返される一連のネストしたリストの第1要素に相当する.
通常の入出力セッションで直接Stackを使うことはあまりないだろう.通常は,計算を一時保留にしてからダイアログモードにまず入り,その後で二次的セッションからStackを実行する(ダイアログに関しては「ダイアログ」を参照のこと).
| In[3]:= |
| In[5]:= |
| Out[5]= |
最も単純なのは,評価スタックが評価中のすべての式を記録できるように設定されている場合である.しかし,場合によっては,網羅しない方がよいときもある.例えば,Print[Stack[]]が実行されると,Printが常にスタックの最後の関数になってしまうため不具合が生じる.
StackInhibitを使えば,そのようなことが起らないようにできる.書式StackInhibit[expr]を使うと,式 expr の評価はされるが,評価で発生する関数呼出しはスタックに登録されないようになる.
| In[7]:= |
| Out[7]= |
TraceDialog等の関数を使いダイアログを開始させると,StackInhibitはその都度自動的に呼び出される.このため,ダイアログの中で使われた関数はStackでは表示されない.
| StackInhibit[expr] | 式 expr は評価するが,スタックへの記録を禁止する |
| StackBegin[expr] | 式 expr を評価し,新規スタックを使う |
| StackComplete[expr] | 式 expr を評価し,評価チェーンで生成される中間式もスタックに記録する |
StackInhibitとStackBeginを使い評価プロセスのどの部分をスタックに記録するか指定できる.StackBegin[expr]は,式 expr が評価される前に新たなスタックを用意する.つまり,スタックには式 expr の評価で使われたもの以外は記録されない.StackBeginの前に使われた関数等は入らない.TraceDialog[expr, ...]等のダイアログ用関数では,まずStackBeginが呼び出され,それから式 expr が評価される.このため,スタックを参照することで,式 expr がどのように評価されるかは知ることができるが,TraceDialog自体がどう呼ばれたかは分からない.
Stackは現在評価中の式だけを表示する.このため,最も最近の式の形が表示される.しかし,場合によっては,過去に取った式の形を見ることができると好都合である.これを行うには,StackCompleteを使う.
StackComplete[expr]を使うと,評価中の各式から派生した評価チェーンの逐一をスタックに記録することができる.この機能は,TraceにTraceAbove->TrueとTraceBackward->Allのオプション設定をしたときに得られる機能に相当する.
