|
2.9.17 発展:低レベル入出力の規則

式とボックスの変換用の低レベル関数
入力式は評価しないまま,StandardFormのボックス形に変換する.
In[1]:= MakeBoxes[2 + 2, StandardForm]
Out[1]= 
ボックス形の式を計算可能な式に変換する.ただし,保留関数 HoldCompleteが適用され,実際の計算は行われない.
In[2]:= MakeExpression[%, StandardForm]
Out[2]= 
Mathematicaには入力式の解釈と出力式の生成のために膨大な数の規則が組み込まれている.それらの規則は,特に, StandardFormにおいて矛盾がないように設定されている.したがって,StandardFormの入出力では入力用の式と出力用の式が交換可能になる.
演算子の処理規則をカスタマイズすることは非常にまれであろう.それは必要がないからである. Mathematicaには多くの機能上未定義な演算子に関しても,入出力処理で使う規則がすでに組み込まれているからである.
例えば,乗算演算子の一般形を作るならば, 等の演算子に入出力処理の規則がすでに定義済みなので,それを使えば用が足りる.
出力式が の演算子で表示される.
In[3]:= CirclePlus[u, v, w]
Out[3]= 
また,入力すると が演算子であることが認識される.
In[4]:= u v w // FullForm
Out[4]//FullForm= 
Format[expr]を使い特定の式を特殊書式で表示させる方法は説明したが,一度書式変換した出力式は入力式としては使えなくなってしまうので気を付ける.
必要ならば,基本的な入出力の処理規則から定義しなおすことも可能である.つまり, MakeBoxesと MakeExpressionの割付け式を定義する.ただし,少しでも間違った定義をすると,矛盾してしまうので十分な注意が必要である.
StandardFormにおいて gplusをどう表示したらよいか詳細な指定をする.
In[5]:= gplus /: MakeBoxes[gplus[x_, y_, n_], StandardForm] := RowBox[ {MakeBoxes[x, StandardForm], SubscriptBox["\[CirclePlus]", MakeBoxes[n, StandardForm]], MakeBoxes[y, StandardForm]} ]
gplusが添数付きの演算子 として表示される.
In[6]:= gplus[a, b, m+n]
Out[6]= 
関数としては定義していないので評価されない.
In[7]:= 

添数付きの をFullFormの入力として扱うよう割付け式を定義する.
In[8]:= MakeExpression[RowBox[{x_, SubscriptBox[ "\[CirclePlus]", n_], y_}], StandardForm] := MakeExpression[RowBox[ {"gplus", "[", x, ",", y, ",", n, "]"}], StandardForm]
この記述は入力式として解釈できない.添数付きの はgplusとして扱われる.
In[9]:= 
Out[8]//FullForm= 
MakeBoxesを使い規則を定義することは,基本的に Format機能を使った変換書式の定義付けの低レベル版に相当する.両者の違いは, MakeBoxesでは引数の評価は行われないが, Formatでは行われる,ということにある.したがって,前者を使うときは,変換した式が評価処理を経てどうなるかは全く気にせずに変換規則を組み立てることができる.
さらに, Formatを使った場合,式を変換して得られた二次的な式にさらに Formatの変換が必要な要素があれば,その変換関数は再度自動的に適用される. MakeBoxesは動作が異なり,二次的な式に変換を要するものがあっても特別に MakeBoxesを適用しない限り変換は起らない.

入力式に施される処理手順
|