底层的输入输出规则

MakeBoxes[expr,form]按指定格式构造代表 expr 的框符
MakeExpression[boxes,form]构造与 boxes 对应的表达式

用于表达式和框符之间转换的底层函数.

MakeBoxes 在不计算输入的情况下生成框符.
In[1]:=
Click for copyable input
Out[1]=
MakeExpression 解释框符,但使用 HoldComplete 防止所得到的表达式被计算.
In[2]:=
Click for copyable input
Out[2]=

Wolfram 语言中有许多规则产生输出和解释输入. 尤其是在 StandardForm 中,这些规则被精心设计成一致的,允许输入和输出交换使用.

一般不需要修改这些规则. 主要是因为 Wolfram 语言对没有特定含义的运算符已经定义了输出和输入规则.

所以当需要进行更一般的相加时,就可以使用运算符 ,Wolfram 语言已经对它设置了输入和输出规则.

使用运算符 的输出.
In[3]:=
Click for copyable input
Out[3]=
Wolfram 语言理解输入中的 .
In[4]:=
Click for copyable input
Out[4]//FullForm=

通过定义 Format[expr] 可以改变某一特定表达式的输出格式. 但要认识到一旦这样做,无法保证所定义的表达式的输出形式在作为 Wolfram 语言的输入时被正确解释.

需要时可以在 Wolfram 语言中重新定义用于表达式的输入和输出的基本规则,这可以通过定义 MakeBoxesMakeExpression 来实现. 但一定要非常仔细地给出这类定义,否则可能出现不一致的结果.

定义 对象如何按 StandardForm 输出.
In[5]:=
Click for copyable input
现在 用带下标的 输出.
In[6]:=
Click for copyable input
Out[6]=
但 Wolfram 语言无法将其解释为输入.
这里令 Wolfram 语言将带下标的 解释为 FullForm 输入的一个特定部分.
In[8]:=
Click for copyable input
现在该带下标的 被解释成 .
In[9]:=
Click for copyable input
Out[9]//FullForm=

可以将定义 MakeBoxes 看作实质上给出 Format 的底层定义. 一个重要的区别是 MakeBoxes 不计算它的变量,所以可以定义表达式格式化的规则,而不需要考虑这些表达式将如何被计算.

另外,对于 Format 产生的任何结果进行格式化时, Format 被自动再次调用,而 MakeBoxes 不是这样. 这意味着定义了 MakeBoxes 后,对子表达式格式化必须重新明确调用 MakeBoxes.

将输入分解为记号.
去掉空格字符.
使用内部的优先级构造框符.
去掉 StyleBox 和其他不需要被解释的框符.
执行为 MakeExpression 定义的规则.

Wolfram 语言输入中完成的运算.

Translate this page: