Wolfram mathematica 前端对表达式的转换
正如我最近所说,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]] 但是,复制粘贴打印输出
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