Jak uzyskać wszystkie definicje symboli powiązanych z innymi symbolami: TagSet
, TagSetDelayed
, UpSet
lub UpSetDelayed
?Jak uzyskać wszystkie definicje związane z innymi symbolami?
Na przykład, jeśli ktoś określił
area[square] ^= s^2
area[cube] ^= 6*s^2
jak uzyskać te definicje, nie znając nazwisk square
, cube
ale znając tylko nazwę area
?
właśnie odkryli, że UpValues
nie zwraca definicje dla MakeBoxes
i N
ponieważ są one przechowywane w FormatValues
i NValues
odpowiednio:
In[1]:= rotate /: MakeBoxes[expr_rotate, "StandardForm"] := x
UpValues[rotate]
FormatValues[rotate]
Out[2]= {}
Out[3]= {HoldPattern[MakeBoxes[expr_rotate, "StandardForm"]] :> x}
In[4]:= pi /: N[pi] = 3.14
UpValues[pi]
NValues[pi]
Out[4]= 3.14
Out[5]= {}
Out[6]= {HoldPattern[N[pi, {MachinePrecision, MachinePrecision}]] :>
3.14}
W ten sposób zamiast UpValues
powinniśmy użyć kombinacji UpValues
, FormatValues
i NValues
.
Podczas próby wyjścia listę FormatValues
można problemy ze MakeBoxes
od FormatValues
daje definicje MakeBoxes
tych are further processed by MakeBoxes
on creating the output for the FrontEnd. Ten problem można rozwiązać, tymczasowo przełączając FormatType
na OutputForm
lub konwertując te definicje na ciągi.
In[1]:= SetOptions[$Output,FormatType->OutputForm];
FormatValues[DialogNotebook]
Out[2]= {HoldPattern[MakeBoxes[BoxForm`apat$:HoldPattern[DialogNotebook[___]], BoxForm`fpat$_]] :>
BoxForm`BoxFormAutoLoad[MakeBoxes, BoxForm`apat$, BoxForm`fpat$, Typeset`CellNotebook`,
{{CellGroup, _}, {DocumentNotebook, _}, {PaletteNotebook, _}, {DialogNotebook, _}, {ExpressionCell, _}, {Text, _},
{TextCell, _}, {Cell, HoldPattern[MakeExpression[_Cell, _]]}, {Notebook, HoldPattern[MakeExpression[_Notebook, _]]}}]}
In[1]:= [email protected][DialogNotebook]
Out[1]= {HoldPattern[MakeBoxes[BoxForm`apat$:HoldPattern[DialogNotebook[___]], BoxForm`fpat$_]] :> BoxForm`BoxFormAutoLoad[MakeBoxes, BoxForm`apat$, BoxForm`fpat$, Typeset`CellNotebook`, {{CellGroup, _}, {DocumentNotebook, _}, {PaletteNotebook, _}, {DialogNotebook, _}, {ExpressionCell, _}, {Text, _}, {TextCell, _}, {Cell, HoldPattern[MakeExpression[_Cell, _]]}, {Notebook, HoldPattern[MakeExpression[_Notebook, _]]}}]}
Czy ostatnio edytujesz prośbę o zaktualizowaną odpowiedź lub opublikowano ją tylko po to, aby pomóc innym znaleźć to pytanie? –
@ Mr.Wizard Myślę, że lepiej byłoby zaktualizować odpowiedź za pomocą kompletnego rozwiązania. –
@ Mr.Wizard Problem jest naprawdę trudny. Zobacz edytowaną część mojego pytania. Teraz rozumiem, dlaczego programiści przenieśli wszystkie definicje 'MakeBoxes' do ledwo udokumentowanych' FormatValues'. :) –