gpt4 book ai didi

wolfram-mathematica - 是否可以创建 MakeBoxesStop 包装器?

转载 作者:行者123 更新时间:2023-12-04 08:15:35 25 4
gpt4 key购买 nike

is known输出表达式通过 MakeBoxes将图形表达式转换为前端用来表示图形的框语言(当 $Output 具有默认选项 FormatType->StandardForm 时)。例如,如果我们评估:

HoldComplete[Graphics[Disk[]]]

我们得到一个由 HoldComplete 包裹的磁盘:

screenshot

这是因为 HoldComplete不停止 MakeBoxes从将其内容转换为排版表达式:
In[4]:= MakeBoxes@HoldComplete[Graphics[Disk[]]]
Out[4]= RowBox[{"HoldComplete", "[", GraphicsBox[DiskBox[{0, 0}]], "]"}]

所以我的问题是:是否可以对 MakeBoxes 做一些额外的定义?这样就可以用 head MakeBoxesStop 包裹任何表达式会阻止 MakeBoxes将此表达式转换为排版形式?在这种情况下,表达式应该像任何其他没有与符号相关联的规则的表达式一样在输出中查找;在上述情况下:

screenshot

附言请不要建议使用 InputFormI am not satisfied with its default behavior .

最佳答案

这个功能似乎做到了:

Clear[MakeBoxesStop];
MakeBoxesStop /: MakeBoxes[MakeBoxesStop[expr_], form_] :=
Module[{heldHeads =
Join @@ Cases[expr,s_Symbol[___] :> HoldComplete[s], {0, Infinity},
Heads -> True],
modified, direct, tempContext = ToString[Unique[]] <> "`"},
Block[{$ContextPath = $ContextPath, $Packages = $Packages},
BeginPackage[tempContext];
modified =
Join @@ Map[
Function[head,
ToExpression[ToLowerCase[ToString[Unevaluated[head]]],InputForm, HoldComplete],
HoldAllComplete],
heldHeads];
EndPackage[];
With[{newexpr =
expr /. (List @@ Thread[HoldPattern /@ heldHeads -> modified, HoldComplete])},
With[{result =
MakeBoxes[newexpr, form] /.
Thread[Rule @@
Map[List @@
Map[Function[head, ToString[Unevaluated[head]], HoldAllComplete], #] &,
{modified , heldHeads}]]
},
Remove @@ Names[tempContext <> "*"];
result]]]];

它不会赢得优雅竞赛,并且可能不是很干净,但它似乎可以满足您的要求:
In[270]:= MakeBoxesStop[Graphics[Disk[]]]

Out[270]= Graphics[Disk[List[0, 0]]]

如果你不想在 MakeBoxesStop 里面表达要评估,添加适当的属性和 Unevaluated包裹在 body 里。

编辑

以下简单的制盒函数是基于Mathematica 解析器发布的 here :
Clear[toBoxes];
toBoxes[expr_] :=
First[parse[tokenize[ToString@FullForm[expr]]] //. {
head_String[elem_] :> RowBox[{head, "[", elem, "]"}],
head_String[elems___] :> RowBox[{head, "[", RowBox[Riffle[{elems}, ","]], "]"}]}]

那么,我们需要:
Clear[MakeBoxesStopAlt];
MakeBoxesStopAlt /: MakeBoxes[MakeBoxesStopAlt[expr_], form_] := toBoxes[expr]

例如:
In[327]:= MakeBoxesStopAlt[Graphics[Disk[]]]

Out[327]= Graphics[Disk[List[0, 0]]]

关于wolfram-mathematica - 是否可以创建 MakeBoxesStop 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6534071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com