Wolfram mathematica 如何阻止递归在构造的格式/解释中发生?

Wolfram mathematica 如何阻止递归在构造的格式/解释中发生?,wolfram-mathematica,Wolfram Mathematica,这个问题来自于迈克尔·皮拉特在年给出的答案。在那里,他使用 Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]] 问题是无法复制和粘贴输出(尽管%或Out[]仍然有效)。要解决这个问题,您应该使用解释类型工具,该工具允许表达式作为一个对象显示,但当作为输入提供时,将其解释为另一个对象。我对迈克尔答案的修改是 Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr

这个问题来自于迈克尔·皮拉特在年给出的答案。在那里,他使用

Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]
问题是无法复制和粘贴输出(尽管%或Out[]仍然有效)。要解决这个问题,您应该使用
解释
类型工具,该工具允许表达式作为一个对象显示,但当作为输入提供时,将其解释为另一个对象。我对迈克尔答案的修改是

Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]
可以成功复制和粘贴此文件。问题在于修改复制的表达式。您可以使用
Ctrl-Shift-I
将复制的表达式转换回
InputForm
,然后更改任何需要的内容,并在任何表达式中使用
InputForm
但是如果您尝试使用
Ctrl-Shift-N
将其更改回
StandardForm
,则输入一个递归,在该递归中,
解释中的第二个参数将重复计算。尽管
解释
具有属性
HoldAll
(在正常评估期间正常工作),但仍存在这种情况

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

它工作得很好,所以我以前没有遇到过这个递归问题


所以我的问题(最后)是: 我的
Format
type命令出了什么问题,如何修复?
或者:如何使我的
makebox
type命令的高级等价物?

我曾就此咨询过一位同事,他的建议本质上是,在
makebox
上设置值定义,正如您所演示的,要比在希望从输出到输入紧密集成时使用
Format
更好<代码>格式
并非真正用于生成可重复用作输入的输出,而是用于格式化输出,因此在转换为
标准格式
时,会出现
解释
的意外递归等

您可能会发现该函数是对
makebox
的有用补充

最后,关于盒子结构


顺便说一句,由于解释在正常评估期间工作正常,这可能只是“转换为”类型评估的一个错误……无法在M'ma 7.0.1/Linux AMD64上复制。将您的解释[]表达式测试为“myPlus[a,b,c]”。前后转换没有任何困难。@Eric这是我运行的同一版本和系统。我已经向WRI发送了一份错误报告,看看他们是否重现了这种行为。@Simon这个问题可能可以通过使用David Wagner在1996年的文章中介绍的探测前端和内核之间交互的技术来探索。这很有趣,但目前我还不熟悉。可能稍后…@Simon my的开发已经完成(对于Windows,针对32位系统的全功能)。现在,对于那些希望在旧内核中透明地评估某些代码而不离开当前(较新)版本的Mathematica的人来说,它是一个非常可靠的工具,并且几乎完全不相信较新的前端可以直接与旧内核一起工作。如果我能找到一个合适的地方,我可能会在以后的某个时候分享这个笔记本。谢谢Michael。奇怪的是,除非你“评估到位”,否则建筑工程很好。WRI的一位支持人员为我提交了一份bug报告。现在,我将继续使用
makebox
(和
ToBoxes
)。
myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
   InterpretationBox[RowBox[r],myPlus[expr]]]