這個功能似乎做到這一點:
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
包裝。
編輯
下面簡單的盒子決策功能是基於數學解析器發佈here:
Clear[toBoxes];
toBoxes[expr_] :=
First[parse[tokenize[[email protected][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]]]
正如我在過去幾次談話中提到的那樣,* HoldComplete短語並不會阻止MakeBoxes * ...令人困惑。 'HoldComplete'在評估階段很重要,並且爲了渲染(轉換爲盒子)只是一個普通的包裝。我不明白你爲什麼在這裏提到它。渲染/ FE最重要的是表達式的結果框形式,這與內核中發生的評估完全分離。 –
@Leonnid @Alexey - 關於'在FE中渲染與內核中發生的事情'的評論讓我想起了[this](http://forums.wolfram.com/mathgroup/archive/2008/Jan/msg00427.html )回覆John Fultz給MathGroup的一篇文章。會強制遺留圖形渲染幫助嗎? (可能是一個愚蠢的建議,但認爲我會分享) – telefunkenvf14
@ telefunkenvf14我是錯誤的人問這個問題。但是IMO將表達式以箱子的形式發送給FE,即使它是圖形比發送圖像更清晰,所以我不會強制傳統圖形渲染,除非真的有必要。 –