Как получить все определения, связанные с другими символами?

Как получить все определения для символа, связанного с другими символами с помощью TagSet , TagSetDelayed , UpSet или UpSetDelayed ?

Например, если кто-то определил

area[square] ^= s^2
area[cube] ^= 6*s^2

, как получить эти определения, не зная имен квадрат , куб , но зная только имя область ?


Я только что обнаружил, что 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, _]]}}]}

5
задан Community 23 May 2017 в 12:12
поделиться