底层的输入输出规则

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]=

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

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

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

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

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

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

定义 对象如何按 StandardForm 输出.
In[5]:=
Click for copyable input
现在 用带下标的 输出.
In[6]:=
Click for copyable input
Out[6]=
Mathematica 无法将其解释为输入.
这里令 Mathematica 将带下标的 解释为 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 定义的规则.

Mathematica 输入中完成的运算.

New to Mathematica? Find your learning path »
Have a question? Ask support »