代码之家  ›  专栏  ›  技术社区  ›  Simon

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

  •  10
  • Simon  · 技术社区  · 14 年前

    这个问题是根据迈克尔·皮拉特在 Preventing “Plus” from rearranging things + 符号使用

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

    Interpretation 允许表达式显示为一个事物,但当作为输入提供时解释为另一个事物的类型工具。我对迈克尔的回答的修改是

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

    可以成功复制和粘贴。问题在于修改复制的表达式。可以将复制的表达式转换回 InputForm 使用 Ctrl-Shift-I 输入 在任何表达中。 如果你想把它改回 StandardForm 使用 Ctrl-Shift-N 解释 反复进行评估。尽管如此 有这个属性 HoldAll (在正常评估期间正常工作)。

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

    myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
       InterpretationBox[RowBox[r],myPlus[expr]]]
    

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


    所以我的问题(最后)是: 我的错在哪里 Format 键入命令,怎么能固定? 制造盒 键入命令?

    1 回复  |  直到 7 年前
        1
  •  11
  •   Michael Pilat    14 年前

    我咨询了一位同事,他的建议是在 MakeBoxes Format 格式 不是真的要生成可作为输入重复使用的输出,而是要格式化输出,因此 Interpretation 当转换为 StandardForm

    你可能会发现函数 ToBoxes 对…有用的补充 .

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