由FrontEnd转换表达式

Ale*_*kov 7 wolfram-mathematica mathematica-frontend

据我最近了解到,Mathematica中有一些类型的表达式由FrontEnd自动解析.

例如,如果我们评估,HoldComplete[Rotate[Style[expr, Red], 0.5]]我们看到FrontEnd不显示原始表达式:

截图

是否可以控制FrontEnd的这种行为?

是否有可能获得由FrontEnd自动解析的完整表达式列表?


编辑

我们可以看到MakeBoxes使用时的调用Print:

On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
Run Code Online (Sandbox Code Playgroud)

但是复制粘贴打印输出会改变表达式:HoldComplete[Rotate["text", 1.5707963267948966]].它表明Print不尊重HoldComplete.

在创建输出时,Cell也应该有调用MakeBoxes.有没有办法看到它们?

Ale*_*kov 6

我找到了John Fultz的一篇文章,清楚地解释了图形功能的工作原理:

在版本6中,内核完全没有参与生成渲染图像.在版本6中显示图形所采取的步骤非常类似于显示非图形输出的步骤.它的工作原理如下:

1)表达式被评估,并最终产生一些头部Graphics[]Graphics3D[].

2)结果表达式通过MakeBoxes. MakeBoxes有一组规则,将图形表达式转换为前端用于表示图形的框语言.例如,

In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]
Run Code Online (Sandbox Code Playgroud)
Out[9]= GraphicsBox[{PointBox[{0, 0}]}]
Run Code Online (Sandbox Code Playgroud)

在内部,我们称之为"排版"表达式.将图形视为"排版"可能有点奇怪,但它基本上与排版相同(这种方式已经工作了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
Run Code Online (Sandbox Code Playgroud)

这是我们得到的输出:

截图

可以看出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
Run Code Online (Sandbox Code Playgroud)


Sas*_*sha 5

你所见证的有两个方面.首先,将您输入的表达式转录到框中并通过前端渲染这些框.默认情况下,输出使用StandardForm进行排版,StandardForm具有用于渲染图形和几何变换的排版规则.如果您使用InputForm,则没有此类规则.您可以通过Preferences-> Evaluation控制使用哪种表单.

您可以通过在输入上使用InputForm或FullForm或在输出单元格上使用InputForm显示来说服自己HoldComplete正确完成其工作.

在此输入图像描述

编辑使用OutputForm:

在[13]中:= OutputForm [%]

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

关于完整符号列表的问题,它包括图形,几何操作以及可能的其他,但我不知道完整的列表.