相关疑难解决方法(0)

如何在格式/解释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类型命令高级等效?

wolfram-mathematica

10
推荐指数
1
解决办法
768
查看次数

标签 统计

wolfram-mathematica ×1