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

时间:2010-11-06 07:12:47

标签: wolfram-mathematica

这个问题是迈克尔皮拉特在Preventing “Plus” from rearranging things给出的答案。在那里,他使用

定义了自定义+符号
Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]

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

Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]

可以成功复制和粘贴。问题在于修改复制的表达式。您可以使用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]]]

完美无缺,所以我之前没有遇到过这种递归问题。


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

1 个答案:

答案 0 :(得分:11)

我向同事咨询了这个问题,他的建议基本上就是当您希望事物与输出紧密集成时,在MakeBoxes上展示价值定义比使用Format更好回到输入。 Format并非真正用于生成可以重新用作输入的输出,而只是用于格式化输出,因此在转换为Interpretation时,StandardForm会发生意外的递归,等等。 / p>

您可能会发现函数ToBoxesMakeBoxes的有用补充。

最后,here's a tutorial关于盒子结构。

HTH!