如何在格式/解释Mathematica构造中停止发生递归?

Sim*_*mon 10 wolfram-mathematica

这个问题是迈克尔·皮拉特在预防"加号"中重新安排事情所给出的答案.他在那里定义了一个自定义+符号

Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]
Run Code Online (Sandbox Code Playgroud)

这个问题是你不能复制和粘贴输出(虽然%或Out []仍然有效).为了解决这个问题,你应该使用Interpretation类型工具,它允许表达式显示为一个东西,但在作为输入提供时被解释为另一个.我对迈克尔答案的修改是

Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]
Run Code Online (Sandbox Code Playgroud)

这可以成功复制和粘贴.问题在于修改复制的表达式.您可以将复制的表达式转换回InputForm使用Ctrl-Shift-I然后更改所需的任何内容并使用InputForm任何表达式.但是如果你试图将它改回StandardForm使用,Ctrl-Shift-N那么你输入一个递归,其中Interpretation重复的第二个参数被评估.这是尽管Interpretation具有属性HoldAll(在正常评估期间正常工作).

通常,在定义简单符号时,我使用低级MakeBoxes,例如

myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
   InterpretationBox[RowBox[r],myPlus[expr]]]
Run Code Online (Sandbox Code Playgroud)

哪个工作完美,所以我之前没有遇到过这个递归问题.


所以我的问题(最后)是:我的Format类型命令出了什么问题,它怎么能修复?或者:你如何使我的MakeBoxes类型命令高级等效?

Mic*_*lat 11

我向一位同事咨询了这个问题,他的建议主要是在MakeBoxes你展示Format时提出价值定义比使用从输出到输入紧密集成的东西更好.Format实际上并不是为了产生可以重新用作输入的输出,而只是为了格式化输出,因此Interpretation在转换时会产生意外的递归StandardForm,等等.

您可能会发现该函数ToBoxes是一个有用的补充MakeBoxes.

最后,这是一个关于盒子结构的教程.

HTH!