# Data Type of ALG Language

## Why Need Data Type

Languages Python and Matlab/Octave are weakly typed which can be convenient for writing the code. However, that is problematic for implementation. The efficiency is not satisfactory compared to C++, and sometimes you may encounter ambiguous error information in Matlab. Therefore, for the sake of efficiency and generality, ALG language is designed to be strongly typed.

## Structure

The type specification is very simple, because ALG language concentrates on matrices. Basically, the structure of ALG language is prefix + dimension + suffix. For example, `f2c` means a matrix (dimension is 2) with data type as float and property as a constant.

To specify a variable, add `::` between the variable and data type. For example, `a::f0` has type `f0` (a float scalar).

## Specifiers

### Prefix

#### Basic Type Prefix

Basic type just names the element type.

Prefix Type C++ Type Python Type Matlab/Octave Type
`c` Complex `cx_double` `complex` `complex`
`f` Float `double` `double` `double`
`i` Integer `int` `int` `int64`
`u` Unsigned Integer `uword` `uint` `uint64`
`b` Boolean `bool` `bool` `logical`
`s` String `std::string` `str` `string`
`h` Character `char` `char` `char`

#### Alias Prefix

Alias prefixes not only set the element type, but also the dimension. They are the one character alias for a two-character type.

Alias Prefix Type Equivalent Two-character Type
`v` (Column) Vector `c1`
`r` Row Vector `c2`
`m` Matrix `c2`
`t` Tensor `c3`
`d` Double `f0`

`v`, `r`, `m` and `t` are all for complex types. For a non-complex type, you need to use the normal two-character way.

Row vector (`r`) is actually regarded as a matrix for simplicity, so its dimension is still 2. Only column vector (`v`) is the real vector. But there can be differences in terms of `INIT`, so it should not be confused with `m`.

### Dimension

Dimensions range from 0 to 3.

Dimension Type C++ Type
0 Scalar
1 Vector `Col`
2 Matrix `Mat`
3 Tensor `Cube`

Dimension for a scalar can not be omitted.

Please note that matrices are stored in column major order, which is the default order in C++ (Armadillo) and Matlab/Octave. In Python (NumPy), it is equivalent to the option `order='F'`.

You should always remember the column major order, especially if you use are accustomed to Python. The order will make a big difference to matrix reshape and vectorization.

### Suffix

Suffix Meaning C++ Python Matlab/Octave
`c` Constant `const` (None) `persistent`
`r` Reference `reference` (None) (None)

Two suffixes cannot be used together and there is also no need to do so. The use of `r` is mainly in `FUNCTION`, allowing a parameter to be changed inside the function body.