Wolfram mathematica 前端对表达式的转换

Wolfram mathematica 前端对表达式的转换,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,正如我最近所说,Mathematica中有一些类型的表达式由前端自动解析 例如,如果我们计算holdplete[Rotate[Style[expr,Red],0.5]]我们会看到前端没有显示原始表达式: 有可能控制前端的这种行为吗 是否有可能获得前端自动解析的表达式的完整列表 编辑 使用Print时,我们可以看到对makebox的调用: On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]] 但是,复制粘贴打印输出

正如我最近所说,Mathematica中有一些类型的表达式由前端自动解析

例如,如果我们计算
holdplete[Rotate[Style[expr,Red],0.5]]
我们会看到前端没有显示原始表达式:

有可能控制前端的这种行为吗

是否有可能获得前端自动解析的表达式的完整列表


编辑 使用
Print
时,我们可以看到对
makebox
的调用:

On[MakeBoxes]; Print[HoldComplete@Rotate["text", Pi/2]]
但是,复制粘贴打印输出会改变表达式:
holdplete[Rotate[“text”,1.57079636267948966]
。它表明
Print
不尊重
HoldComplete


当创建输出
单元格
时,也应该调用
生成框
。有没有办法看到他们?

你所看到的有两个方面。首先,转录输入框中的表达式,并在前端呈现这些框。默认情况下,输出使用StandardForm进行排版,StandardForm具有用于呈现图形和几何变换的排版规则。如果使用InputForm,则没有此类规则。您可以通过首选项->评估来控制使用哪个表单

通过在输入上使用InputForm或FullForm,或者在输出单元格上使用InputForm display,您可以说服自己HoldComplete正确地完成了它的工作

使用OutputForm编辑

在[13]:=OutputForm[%]

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


关于您关于符号完整列表的问题,它包括图形、几何运算,可能还有其他,但我不知道完整列表。

答案不太清楚,但在“首选项>评估”中,有一些选项“在将(输入|输出)转换为排版形式时仅使用文本框。”

如果选中这些选项,则使用“单元格>转换为…”标准表格等。。。将显示旋转[…]而不是视觉旋转的结果。

我发现了一个关于图形功能如何工作的非常清晰的解释:

在版本6中,内核具有 绝对没有任何牵连 在生成渲染图像时。 在显示 版本6中的图形非常有用 像那些用来展示 非图形输出。它的工作原理是 如下:

1) 对表达式求值,然后 最终生产出有价值的东西 头部
Graphics[]
Graphics3D[]

2) 传递结果表达式 通过
makebox
<代码>生成框具有 用于旋转图形的一组规则 将表达式转换为box语言 前端用于表示 绘图。例如:

In[9]:= MakeBoxes[Graphics[{Point[{0, 0}]}], StandardForm]
在内部,我们称之为“排版” 表情。这可能有点奇怪 将图形视为 “排版”,但它基本上是 同样的操作发生在 排版(这种方式有效吗 11年),所以我用这个词

3) 得到的排版表达式是 通过MathLink发送到前端

4) 前端解析排版 表达式并创建内部 通常具有 一对一通信到 排版表达式

5) 前端渲染内部图像 对象

这意味着转换是通过调用
makebox
在内核中执行的

可以通过高级代码拦截此调用:

list = {};
MakeBoxes[expr_, form_] /; (AppendTo[list, HoldComplete[expr]]; 
    True) := Null;
HoldComplete[Rotate[Style[expr, Red], 0.5]]
ClearAll[MakeBoxes];
list
以下是我们得到的输出:

可以看到,
makebox
不尊重
HoldAllComplete
属性

在发送到前端之前自动转换的符号列表可以从
格式值中获得:

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
John Fultz最近提出了我关于将
表格格式
转换为“排版”表达式的问题,值得在此引用,因为它放大了(部分矛盾)以下引用的一般解释:

ToBoxes
返回的正是 内核发送到前端 无变化(除以下情况外): 一般情况,用于评估 语义和可能的副作用 与众不同,但这不是一个好主意 问题(在您的示例中)

问题在于,前端已经 两种不同规格的 正在指定
GridBox
选项。。。什么之中的一个 它可以追溯到第3版 其他的,更广泛的设定日期 第6版。前端理解 两组选项,但 将接收到的任何内容规范化为 版本6选项

GridBox
是唯一具有 如此大规模地改变选择, 而且有必要支持新技术 我们在v6中添加的功能。但是 前端将继续理解 旧的选择会持续很长时间 时间(可能永远),就像过去一样 选项不仅在某些情况下出现 内核排版构造,但在 遗留笔记本文件

TableForm的
ToBoxes[]
正在创建 遗留选项,因为没有 需要更新
TableForm
一会儿(
ToBoxes[]
of 另一方面,网格使用现代 选项)。转换是由 前端。你可以相信 前端进行转换 你,或者你可以弄清楚 选项映射你自己


因此,在本例中,表达式转换的最后阶段由前端完成。

我不同意前端在本例中不显示原始表达式的说法。您看到的纯粹是一种显示模式,它不会以任何方式修改代码本身。例如,
InputForm
显示表达式未更改。这就引出了一个问题:为什么
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