'Return a new variable.
Parameters
name : Symbol or MatrixSymbol
datatype : optional
When not given, the data type will be guessed based on the
assumptions on the symbol argument.
dimension : sequence containing tupes, optional
If present, the argument is interpreted as an array, where this
sequence of tuples specifies (lower, upper) bounds for each
index of the array.
precision : int, optional
Controls the precision of floating point constants.'

def __init__(self, name, datatype=None, dimensions=None, precision=None):

    if (not isinstance(name, (Symbol, MatrixSymbol))):
        raise TypeError('The    first    argument    must    be    a    sympy    symbol.')
    if (datatype is None):
        datatype = get_default_datatype(name)
    elif (not isinstance(datatype, DataType)):
        raise TypeError("The    (optional)    `datatype'    argument    must    be    an    instance    of    the    DataType    class.")
    if (dimensions and (not isinstance(dimensions, (tuple, list)))):
        raise TypeError('The    dimension    argument    must    be    a    sequence    of    tuples')
    self._name = name
    self._datatype = {'C': datatype.cname, 'FORTRAN': datatype.fname, 'JULIA': datatype.jlname, 'OCTAVE': datatype.octname, 'PYTHON': datatype.pyname, 'RUST': datatype.rsname}
    self.dimensions = dimensions
    self.precision = precision
