Я нашел сообщение Джона Фульца с довольно четким объяснением того, как работают графические функции:
В версии 6 ядро имеет
абсолютно никакого участия вообще
в создании визуализированного изображения.
Шаги, предпринятые при отображении
графики в версии 6 очень много
как те, которые используются при отображении
неграфический вывод. Работает как
следующим образом:
1) Выражение оценивается, и
в конечном итоге производит что-то с
голова Graphics[]
или Graphics3D[]
.
2) Полученное выражение передается
до MakeBoxes
. MakeBoxes
имеет
набор правил, который превращает графику
выражение в поле языка, который
внешний интерфейс использует для представления
графика. Например.,
In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]
Out[9]= GraphicsBox[{PointBox[{0, 0}]}]
Внутренне мы называем это «набор текста»
выражение. Это может быть немного странно
думать о графике как о
"набрано", но это принципиально
та же операция, которая происходит для
набор текста (который работал таким образом
11 лет), поэтому я буду использовать термин.
3) Результирующее набранное выражение
отправлено через MathLink на внешний интерфейс.
4) Внешний интерфейс анализирует набор
выражение и создает внутренний
объекты, которые обычно имеют
непосредственное соответствие
набранное выражение.
5) Передний конец отдает внутренний
объекты.
Это означает, что преобразование выполняется в ядре путем вызова MakeBoxes
.
Этот вызов может быть перехвачен с помощью кода высокого уровня:
list = {};
MakeBoxes[expr_, form_] /; (AppendTo[list, HoldComplete[expr]];
True) := Null;
HoldComplete[Rotate[Style[expr, Red], 0.5]]
ClearAll[MakeBoxes];
list
Вот что мы получаем в результате:
Видно, что MakeBoxes
не относится к атрибуту HoldAllComplete
.
Список символов, которые автоматически преобразуются перед отправкой в FrontEnd, можно получить из 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