Как получить все определения для символа, связанного с другими символами TagSet
, TagSetDelayed
, UpSet
или UpSetDelayed
?
Например, если кто-то определил
area[square] ^= s^2
area[cube] ^= 6*s^2
как получить эти определения, не зная имен square
, cube
, но зная только имя area
?
Я только что обнаружил, что UpValues
не возвращает определения для MakeBoxes
и N
, поскольку они хранятся в FormatValues
и NValues
соответственно:
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}
Таким образом, вместо UpValues
мы должны использовать комбинацию UpValues
, FormatValues
и NValues
.
При попытке вывести список FormatValues
могут возникнуть проблемы с MakeBoxes
, поскольку FormatValues
дает определения для MakeBoxes
, эти дополнительно обрабатываются MakeBoxes
при создании вывода для FrontEnd . Эту проблему можно решить, временно переключив FormatType
на OutputForm
или преобразовав эти определения в строки.
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]:= ToString@FormatValues[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, _]]}}]}