Often when I'm writing a project in Mathematica, the number of arguments I must provide to functions spins out of control.

I need a sort of object-oriented encapsulation approach. I've already had a go at doing this in Java, and now believe than an object-oriented language is not well suited to my needs.

## Example:

Here I fetch data for the geodesic of a test particle in a pseudo-Riemannian manifold. The user must supply the metric in matrix form, the initial positions and velocities, and other miscellaneous things:

NGeodesicData[( {
{(1 - (1/#2)) &, 0 &, 0 &},
{0 &, -(1 - 1/#2)^-1 &, 0 &},       (*Matrix of real functions*)
{0 &, 0 &, (-#2^2) &}
} ) ,
{{0, 50, 0.}, {Null, 0., .0008}},   (*Initial position and velocity*)
{1, True, True},                    (*Miscellaneous*)
2500, .01, 1]                         (*Numerical integration settings*)


All of these arguments are necessary, and I would like to structure them in a more manageable format.

Specifically, I would like a head called TangentVector which consists of:

1. An n x n matrix of real functions of n variables each. (The matrix of real functions)
2. A list of two n-dimensional vectors. (the initial position and velocity; a tangent vector)

I am used to object-oriented languages where I can program a constructor in which I can perform checks, throw exceptions or warnings if I need to, and store a couple of fields based on the input. Basically, I'm looking to do the same thing here.

How can I create such a TangentVector structure, and make a constructor for it?

I believe I have already found a solution to complicated pattern-matching (on the inputs to the constructor) here.

• So are you after the pattern for matching? Or a OO-implementation? Going with standard Mathematica paradigms might be less hassle (there are several threads on OO around though). Commented Jul 1, 2015 at 6:29
• @YvesKlett - I have solved the pattern-matching problem; the main thing is that I need a constructor which can take input (I know how to do the pattern matching) and create a TangentVector structure based on that. The reason that I want this structure is so that other functions can take in TangentVectors as inputs. The best way I know of to do this is to create a custom head. I will be happy with any encapsulation approach though. Commented Jul 1, 2015 at 6:32
• Possible duplicates: (4636), (16869), (33884), (73960) Commented Jul 1, 2015 at 11:11
• Suggest you look at Association Commented Jul 1, 2015 at 14:00
• You might find some of answers to [this question[(mathematica.stackexchange.com/q/990/3066) of interest, although I think the addition of Association in V10 makes some the answers obsolescent. Commented Jul 1, 2015 at 14:07