# How can one define a custom data object?

In Mathematica there are different objects like InterpolatingFunction or SparseArray? How can I define a custom data object with special data structure?

Example:

f = Interpolation[{1, 2, 3, 5, 8, 5}];
f // InputForm


returns us

InterpolatingFunction[{{1, 6}}, {4, 3, 0, {6}, {4}, 0, 0, 0, 0, Automatic},
{{1, 2, 3, 4, 5, 6}}, {{1}, {2}, {3}, {5}, {8}, {5}}, {Automatic}]


But if one evaluates the above output one gets back

InterpolatingFunction[{{1, 6}}, <>]


I could not find any documentation how to do it for any custom data object that I want to define for my program.

Format is what you are looking for: Create a data structure, something like this:

mkMyData[d1_, d2_] := MyData[d1, d2]
GetD1[a_MyData] := a[[1]]
GetD2[a_MyData] := a[[2]]
Format[MyData[d1_, d2_]] := "MyData[<" <> ToString[Length[d1] + Length[d2]] <> ">]"


Call the constructor:

data = mkMyData[Range[5], q]


(* "MyData[<5>]" *)

Call a selector:

GetD1[data]


(* {1, 2, 3, 4, 5} *)

As Michael Pilat explained here it is more robust to use MakeBoxes, rather than Format.

Using MakeBoxes:

MakeBoxes[diag[m_?MatrixQ], _] ^:=
InterpretationBox[RowBox[{"diag", "[", #, ",", #2, "]"}], diag[m]] & @@
ToBoxes /@ {Dimensions[m], Diagonal[m]}


Here is a definition for handling Part extraction:

diag[m_?MatrixQ][[part___]] ^:= m[[part]]


Result:

mat = DiagonalMatrix[{1, 2, 3, 4, 5}];

diag[mat]

diag[{5, 5}, {1, 2, 3, 4, 5}]

diag[mat][[2]]

{0, 2, 0, 0, 0}

• Is there a way to handling Apply or Function for your example, ie. such that diag[mat]["Something"] would result specified result? Jul 7, 2016 at 13:49
• @Karolis I think you are looking for (7999)? The formatting rule (with MakeBoxes) should be independent of other definitions so this form should still work, e.g. diag[m_?MatrixQ]["Det"] := Det[m] and then diag[mat]["Det"] evaluates to 120 just as Det[mat] does. Jul 7, 2016 at 20:40