|
2.14.1 メインループ
Mathematicaセッションにおける対話モードを可能にしているのがフロントエンドの「メインループ」である.これは,ユーザからの入力待ち,カーネルへの入力の送出,評価結果の表示,そして再び入力待ちに戻るといった一連の操作を常時繰り返す機構のことである.本章ではこのメインループに関連した大域オブジェクトの扱い方を説明する.
ユーザの使うフロントエンドが特別なものならば,上述のループとは別の形態の機構が使われているかもしれない.そのようなときは本章の説明は適応されないだろう.

入出力行
標準的なセッションでは,対話が進められるに従い入力と出力の行が交互に連なって表示される.n番目の入力と出力であれば,それらの値はそれぞれIn[n]とOut[n]に保管される.
通常のIn[n]:=プロンプトで示されるように,入力される式は遅延型の割当てとともに保管される.つまり,In[n]の要求があるたびに,それに対応する入力式は現在の環境において再び評価される.
xに値を割り当てる.
In[1]:= x = 7
Out[1]= 
xを使った式を計算させる.割り当てられた値が使われる.
In[2]:= x - x^2 + 5x - 1
Out[2]= 
xに割り当てられた値を消去する.
In[3]:= x =.
2番目の入力式を再計算させる.前と違い,xには何も値が割り当てられてい ない.
In[4]:= In[2]
Out[4]= 
同じ式のテキスト形式を見る.テキスト形式を使うと編集等のテキストを直接操作する作業で便利である.
In[5]:= InString[2] // InputForm
Out[5]//InputForm= "x - x^2 + 5x - 1"

セッションの履歴長の指定
セッションの開始から終了まで,ユーザの入力行と出力行は通常すべて保管される.このため,長引くセッションでは大量のメモリを消費するような事態を招きかねない.そこで,不要になった入力行と出力行は個別に消去できるようになっている.入力式をInとし出力式をOutとするならば,これらの式を消去するには,Unprotect[In, Out]と入力した後に,Clear[In, Out]と入力する.また,大域変数$HistoryLengthを小さめに設定することで,入出力履歴の保管サイズを限定することもできる.
$Lineと呼ばれる行番号のカウンタが用意されている.このカウンタをセッションのどこからでも再設定することで,新規に生成される式が古い式を上書きするようにすることができる.

メインループで使われる大域関数
Mathematicaには各種の「フック」が用意されているので,それらに対して関数を指定しておけば,メインループの各段階においてカスタム的な式の処理方法を使うことができる.例えば,大域変数$Preに対してある関数を割り当てておけば,入力される式が何であってもそれは式が評価される前に自動的に適用される.
標準メインループで行われる最初の処理項目は入力された文字列の取込みである.特に,特殊文字を扱う必要がある場合はMathematicaに処理させる前にこの文字列を編集しておきたいことがある.その場合は,大域変数$PreReadに編集に使う関数を指定しておく.すると,処理の前にその関数が文字列に適用され,その結果が特定の入力行に対する実際の入力文字として使われる.
入力行に<< ... >>があれば ... で置換するよう指定しておく.
In[6]:= $PreRead = StringReplace[#, {"<<" -> "{", ">>" -> "}"}]&
Out[6]= 
入力は2重角カッコでも,処理は中カッコとして行われる.
In[7]:= <<4, 5, 6>>
Out[7]= 
少なくとも$PreReadに対する定義がこの入力文字列を変更しない限り,$PreReadの値は右のように除去できる.
In[8]:= $PreRead =.
入力された文字列に対する$PreReadの前処理が終了すると,今度はMathematicaにより文字列が処理される.この処理の過程で文法上の誤りが見付かるかもしれない.そのときは,$SyntaxHandlerに割り当てられた関数が呼び出される.この呼出しには2つの引数が伴う.1つは入力文字列そのもので,もう1つは,文字列中の誤りが見付かった位置である.$SyntaxHandlerを利用し,誤りの原因等に関する分析結果を報告させたり,エディタを呼び出したりすることもできる.前処理の関数が文字列を返すのであれば,その文字列がMathematicaへの新たな入力文字列となる.
文法上の誤りが見付かった場合にどのような処置を取る べきかを指定する.
In[9]:= $SyntaxHandler = (Print[StringForm["`2`上の`1`番目のcharにエラーがあります", #2, #1]]; $Failed)&
Out[9]= 
間違いをわざと入力する.
In[10]:= 3 +/+ 5
Syntax::sntxf: "3 +"の後に"/+ 5"が続くことはできません.

文法上の誤りのない入力式が正常に読み込まれると,評価処理が次に施される.ただし,$Preに関数が割り当てられた場合は,評価の前にその関数により定義される前処理が行われる.また,$Postに割当て指定があれば,それは後処理として評価の後に行われる.前処理関数に与えられる引数を評価保留にしておかないと,後処理関数と同じ効果を持つので注意が必要である.
Mathematicaからの結果に対して任意の「後処理」を行うには後処理を定義する関数を$Postに指定しておく.例えば,結果が生成されるたびにその数値近似値を得るには$Post = Nと設定しておく.
カーネルから結果が出るたびにNを適用 する.
In[11]:= $Post = N
Out[10]= 
計算させると,結果は数値近似値として返される.
In[12]:= Sqrt[7]
Out[11]= 
後処理として割り当てた関数を除去する.
In[13]:= $Post =.
Mathematicaが結果を生成し,$Postの後処理が適用されると,直ちにOut[$Line]の値としてのその結果の割当てが行われる.次に,結果の表示が行われる.ここで,$PrePrintに関数が割り当てられている場合はその前にこの関数が適用され表示に関する前処理が行われる.
出力される式はすべて2行分だけ表示する.
In[14]:= $PrePrint = Short[#, 2]& ;
最初の2行だけが表示される.
In[15]:= Expand[(x + y)^40]
Out[14]= 
$PrePrintに割り当てた値を除去する.
In[16]:= $PrePrint =.
Mathematicaのセッションからは各種の出力が生成される.2.12.3で説明したように,出力されるものの種類によって違う出力チャンネルが使われる.各出力チャンネルには,そのチャンネルに割り当てられた出力ストリームのリストを与える大域変数が設けられる.

標準Mathematicaセッションにおける出力チャンネル
出力チャンネルに割り当てられているストリームのリストを変更することで,出力の種類を限定した上でリダイレクトしたりコピーしたりすることが可能になる.例えば,ファイルを出力ストリームとしておき,そのストリームを$Echoのリストに入れておけば,カーネルに入力されるすべての式を自動的にファイルに取っておくことができる.

Mathematicaセッションにおける開いた状態のストリーム
関数Streamsを使えば,現行のセッションでアクティブなストリームをすべて列挙することができる.また,変数$InputはMathematicaへ入力を送るのに現在使われている入力ストリームの名前を与える.$InputはGetコマンド等が実行されると再設定される.

メッセージ表示の制御パラメータ
各種の大域変数が用意されており,それらを使うことでMathematicaにより生成されるメッセージの表示形式を決めることができる.
2.9.21で説明したように,通常,メッセージはStringFormを通してメッセージのテキストと結びつけられた一連の式を含む.表示の前に,$MessagePrePrintに割り当てた関数が式に適用され前処理が行われる.$MessagePrePrintのデフォルト値は関数Shortになっている.
2.9.22で説明したように,メッセージ表示に使う言語が指定できるようになっている.セッションごとに言語名のリストを$Languageの変数として割り当てることができる.

Mathematicaセッションの終了
セッションを終了するように命令するまでメインループにおける操作処理は続く.フロントエンドによっては終了命令のために特別な操作法が用意されているが,ExitもしくはQuitを呼び出せば,フロントエンドの操作法によらず終了処理ができる.
$Epilogと呼ばれる大域変数が用意されており,そこにセッション終了直前にMathematicaに処理させたいことを指定できるようになっている.こうすると,例えば終了前に特定のオブジェクトを保存できる.

エンド・オブ・ファイル識別記号(EOF)の処理
2.8.5で説明したが,文字が特別なものであっても通常特別な扱いをしない.ただし,例外となり得るものが1つある.それはエンド・オブ・ファイル記号(End-Of-File,EOFと省略)で,$IgnoreEOF = Falseの条件が設定してあるときは,記号EOFが有効となり特別扱いされる.つまり,標準対話セッションにおいて,ある入力行で入力したものがEOFだけの場合,そのセッションは即座に終了する.
記号EOFの入力の仕方は使っているオペレーティングシステム環境により違う.例えば,Unixでは通常,組合せキーのControl-Dを押すことで入力できる.
バッチ処理的にMathematicaを使い,ファイルからすべての入力を行う場合は,$IgnoreEOFの現行設定によらずファイルが終了した時点でMathematicaが終了する.
|