Преобразование выражений с помощью FrontEnd - PullRequest
7 голосов
/ 11 апреля 2011

Как я узнал , недавно в Mathematica есть некоторые типы выражений, которые автоматически анализируются FrontEnd.

Например, если мы оцениваем HoldComplete[Rotate[Style[expr, Red], 0.5]], мывидите, что FrontEnd не отображает исходное выражение:

Screenshot

Можно ли управлять таким поведением FrontEnd?

И возможно ли получить полноесписок выражений, которые анализируются FrontEnd автоматически?


EDIT

Мы можем видеть вызовы MakeBoxes при использовании Print:

On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]

Но копирование-вставка напечатанного вывода дает измененное выражение: HoldComplete[Rotate["text", 1.5707963267948966]].Это показывает, что Print не уважает HoldComplete.

При создании вывода Cell также должны быть вызовы для MakeBoxes.Есть ли способ их увидеть?

Ответы [ 4 ]

6 голосов
/ 28 апреля 2011

Я нашел сообщение Джона Фульца с довольно четким объяснением того, как работают графические функции:

В версии 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

Вот что мы получаем в результате:

screenshot

Видно, что 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
5 голосов
/ 11 апреля 2011

Есть два аспекта того, что вы видите.Во-первых, транскрипция выражения, которое вы ввели в блоки, и рендеринг этих блоков с помощью Front-End.По умолчанию выходные данные набираются с использованием StandardForm, у которого есть правило набора для визуализации графики и геометрических преобразований.Если вы используете InputForm, такого правила нет.Вы можете контролировать, какая форма используется, через Preferences-> Evaluation.

Вы можете убедиться, что HoldComplete правильно выполнил свою работу, используя InputForm или FullForm на входе или используя отображение InputForm в выходной ячейке.

enter image description here

РЕДАКТИРОВАТЬ Использование OutputForm:

In [13]: = OutputForm [%]

Out [13] // OutputForm = HoldComplete [Rotate [expr, 0.5]]

Что касается вашего вопроса о полном списке символов, он включает в себя графику, геометрические операции и, возможно, другие, но я не знаю полного списка.

2 голосов
/ 11 апреля 2011

Не совсем ответ, но в «Предпочтения»> «Оценка» есть параметры «Использовать только текстовые поля при преобразовании (ввод | вывод) в наборные формы».

Если вы проверите это, то при использовании Cell> Convert To ...> StandardForm и т. Д. ... вместо поворота визуально повернутого будет отображаться Rotate [..].

1 голос
/ 07 июня 2011

Джон Фульц недавно ответил на мой вопрос о преобразовании TableForm в выражения "typeset", и его стоит привести здесь, поскольку он усиливает (хотя и частично противоречит) общее объяснение, приведенное в мой предыдущий ответ :

ToBoxes возвращает именно то, что ядро ​​отправляет внешнему интерфейсу без изменений (за исключением, в общем случае, семантики оценки и побочных эффектов, возможно, отличающихся, но это не проблема в вашем примере).

Проблема заключается в том, что интерфейс имеет две разные спецификации для указания параметров GridBox ... одна из которых относится к версии 3, а другая -расширенный набор дат для версии 6. Интерфейс понимает оба набора параметров, но канонизирует все, что получает, до параметров версии 6.

GridBox - единственная коробка, в которой было такое массовое изменение параметрови необходимо было поддерживать новые функции, которые мы добавили в v6.Но клиентский интерфейс будет продолжать понимать старые параметры в течение достаточно долгого времени (возможно, навсегда), поскольку старые параметры отображаются не только в некоторых конструкциях набора текста ядра, но и в устаревших файлах ноутбука.

ToBoxes[]из TableForm создает устаревшие параметры, так как не было необходимости обновлять набор текста TableForm в течение некоторого времени (ToBoxes[] из Grid, с другой стороны, использует современные параметры).Преобразование выполняется внешним интерфейсом.Вы можете полагаться на интерфейс, чтобы выполнить преобразование для вас, или вы можете сами выяснить, как эти параметры отображаются.

Таким образом, в этом случае заключительный этап преобразования выражения выполняетсяFrontEnd.

...