Ale*_*kov 4 wolfram-mathematica mathematica-frontend
我经常希望看到Mathematica的图形对象的内部表示不在其中,FullForm但更具可读性InputForm,能够通过双击选择部分代码并轻松地将此代码复制到新输入Cell.但默认情况下InputForm不允许这样做,因为InputForm默认显示为a String,而不是Mathematica的代码.有没有办法InputForm显示为Mathematica的代码?
我还经常希望看到这样的缩短版本,InputForm其中所有长坐标列表都显示为第一个坐标后跟包裹的跳过坐标值的数量Skeleton,所有空的都Lists被移除,所有数字也缩短以显示不超过6个数字.最好仅将6位数用于坐标,但对于颜色指令,例如Hue仅显示2位有效数字.例如,
Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]},
Filling -> {1 -> {2}}] // ShortInputForm
Run Code Online (Sandbox Code Playgroud)
应该给:
Graphics[GraphicsComplex[{{1.28228`*^-7, 1.28228*^-7}, <<1133>>},
{{{EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}],
GraphicsGroup[{Polygon[{{1133, <<578>>}}]}]},
{EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}],
GraphicsGroup[{Polygon[{{432, <<556>>}}]}]}}, {{Hue[0.67, 0.6,
0.6], Line[{1, <<431>>}]}, {Hue[0.91, 0.6, 0.6],
Line[{432, <<701>>}]}}}], {AspectRatio -> GoldenRatio^(-1),
Axes -> True, AxesOrigin -> {0, 0},
Method -> {"AxesInFront" -> True},
PlotRange -> {{0, 2*Pi}, {-1., 1}},
PlotRangeClipping -> True,
PlotRangePadding -> {Scaled[0.02], Scaled[0.02]}}]
Run Code Online (Sandbox Code Playgroud)
(注意-0.9999998592131705转换为-1.,1.2822827157509358*^-7转换为1.28228*^-7并Hue[0.9060679774997897, 0.6, 0.6]转换为Hue[0.91, 0.6, 0.6]).
通过这种方式,我希望拥有的输出InputForm作为数学的代码,同时也有一个ShortInputForm功能,这将给该代码的简化版本.有谁能够帮我?
至于问题的第一部分,我找到了一种实现我想要的方法:
Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] //
InputForm // StandardForm
Run Code Online (Sandbox Code Playgroud)
shortInputForm可以在此处找到该函数的最新版本.
这是另一个更好的解决方案(与Mathematica 5 兼容):
myInputForm[expr_] :=
Block[{oldContexts, output, interpretation, skeleton},
output = ToString[expr, InputForm];
oldContexts = {$Context, $ContextPath};
$Context = "myTemp`"; $ContextPath = {$Context};
output = DisplayForm@ToBoxes[ToExpression[output] /.
{myTemp`interpretation -> If[$VersionNumber >= 6,
System`Interpretation, System`First@{#} &],
myTemp`Row -> System`Row,
myTemp`skeleton -> System`Skeleton,
myTemp`sequence :> (System`Sequence @@ # &)}, StandardForm];
{$Context, $ContextPath} = oldContexts; output]
shortInputForm[expr_] := myInputForm[expr /. {{} -> Sequence[],
lst : {x_ /; VectorQ[x, NumberQ], y__} /;
(MatrixQ[lst, NumberQ] && Length[lst] > 3) :>
{x /. v : {a_, b__} /; Length[v] > 3 :>
{a, interpretation[skeleton[Length[{b}]], sequence@{b}]},
interpretation[skeleton[Length[{y}]], sequence@{y}]},
lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :>
{x, interpretation[skeleton[Length[{y}]], sequence@{y}]}}]
Run Code Online (Sandbox Code Playgroud)
这个解决方案基于一个简单的想法:我们需要阻止转换这些东西Graphics,Point而其他的转换为排版表达式,以便以内部形式显示它们(作为适合输入的表达式).令人高兴的是,如果我们这样做,StandardForm则会发现结果输出只是InputForm原始表达式的格式化(二维).这正是需要的!
但是怎么做呢?首先,这种转换是通过FormatValues定义为Symbol类似等来完成的.通过评估以下内容Graphics,Point可以得到这样Symbol的完整列表:
list = Symbol /@
Select[DeleteCases[Names["*"], "I" | "Infinity"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &]
Run Code Online (Sandbox Code Playgroud)
我的第一个想法就是Block所有这些Symbol(并且它有效!):
myInputForm[expr_] :=
With[{list = list}, Block[list, RawBoxes@MakeBoxes@expr]]
Run Code Online (Sandbox Code Playgroud)
但这种方法会导致所有这些评价SymbolS和也是评估所有FormatValues所有SymbolS IN的$ContextPath.我认为应该避免.
其他阻止这些方法FormatValues只是去除背景"System`"从$ContextPath.但它只有在Symbol尚未解决这些问题时才有效"System`".所以我们首先需要将表达式转换为String,然后"System`"从中删除上下文$ContextPath,最后将字符串向后转换为原始表达式.然后,所有新的Symbol旨意与当前相关$Context(和Graphics,Point等等-太多,因为他们都不在$ContextPath).为了防止上下文阴影冲突和乱丢"Global`"上下文,我切换$Context到"myTemp`"必要时可以轻松清除.
这是怎么回事myInputForm.
现在约shortInputForm.这个想法不仅仅是显示缩短版本,myInputForm而且还保留了将缩短代码的一部分选择并复制到新输入单元格中的能力,并使用此代码,因为它将是没有缩写的完整代码.在版本6及更高版本中,可以实现后者Interpretation.为了兼容前6版本,Mathematica我添加了一段代码,如果$VersionNumber小于6 ,则删除此功能.
我在处理时遇到的唯一问题Interpretation是它没有SequenceHold属性,所以我们不能简单地指定Sequence为第二个参数Interpretation.但这个问题可以很容易地通过在包装顺序来避免List,然后Apply荷兰国际集团Sequence给它:
System`Sequence @@ # &
Run Code Online (Sandbox Code Playgroud)
请注意,我需要为Symbol我使用的所有内置命令指定确切的上下文,因为在调用它们时,"System`"上下文不在$ContextPath.
这结束了我在开发这些功能时所做的非标准决定.欢迎提出建议和意见!

| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |