グラフィック機能がどのように機能するかについてのかなり明確な説明を含むJohnFultzによる投稿を見つけました。
バージョン6では、カーネルはレンダリングされたイメージの生成にまったく関与していません。バージョン6でグラフィックを表示する際に実行する手順は、非グラフィック出力を表示する場合に使用する手順と非常によく似ています。次のように機能します。
1)式が評価され、最終的にheadGraphics[]
または。で何かが生成されGraphics3D[]
ます。
2)結果の式は。を通過しMakeBoxes
ます。 MakeBoxes
グラフィック式を、フロントエンドがグラフィックを表すために使用するボックス言語に変換する一連のルールがあります。例えば、
In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]
Out[9]= GraphicsBox[{PointBox[{0, 0}]}]
内部的には、これを「タイプセット」式と呼びます。グラフィックを「タイプセット」と考えるのは少し奇妙かもしれませんが、基本的にはタイプセット(11年間このように機能している)で行われる操作と同じなので、この用語を使用します。
3)結果のタイプセット式は、MathLinkを介してフロントエンドに送信されます。
4)フロントエンドはタイプセット式を解析し、一般にタイプセット式に1対1で対応する内部オブジェクトを作成します。
5)フロントエンドは内部オブジェクトをレンダリングします。
これは、への呼び出しによってカーネルで変換が実行されることを意味しMakeBoxes
ます。
この呼び出しは、高レベルのコードを介して傍受される可能性があります。
list = {};
MakeBoxes[expr_, form_] /; (AppendTo[list, HoldComplete[expr]];
True) := Null;
HoldComplete[Rotate[Style[expr, Red], 0.5]]
ClearAll[MakeBoxes];
list
出力として取得するものは次のとおりです。
属性MakeBoxes
を尊重していないことがわかります。HoldAllComplete
フロントエンドに送信する前に自動変換されるシンボルのリストは、次の場所から取得できますFormatValues
。
In[1]:= list =
Select[Names["*"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &];
list // Length
During evaluation of In[1]:= General::readp: Symbol I is read-protected. >>
Out[2]= 162