# Math&Matrix

*This is still a work in progress. It may be changed in the future.*

**Math&Matrix** is a language based on a matrices list. Each matrix in this list is an instruction based on math properties (determinant, invertibility, diagonal/triangle equivalant, ...)
This language is stack-based

## Syntax

A matrix is represented with the following syntax:

*n #,#,#,...,# #,#,#,...,# ... #,#,#,...,# ;

where # and n is an integer number.

Each line begin with a number must have the same number of integer (otherwise, it return an error)

`*n`

represent a division coefficient. Each number in this matrix are divide by *n*. It is the only way to make a float

*if n = 1, this line is optional*

`;;`

end the program

So, a **Math&Matrix** program looks like this:

1,2,3 4,5,6 7,8,9 ; *3 5,10,9,13 0,2,24,11 22,30,1,1 0,7,17,21 ; 1,1,4,9 21,43,78,0 0,5,0,67 465,7483,7878,23 ; ;;

## Instructions

`+, -, *, /, %, ^`

: pop 2 values a and b and push a *op* b

`push A`

: push *A* into the stack

`copy`

: duplicate the top value and push it into the stack

`swap i, j`

: pop 2 values *i* and *j* and swap the position of the *i*-th and the *j*-th element

`del`

: discard the top value

`instr`

: input a char and push the ASCII code into the stack

`outstr`

: pop the top value and print the char which correspond to the ASCII code

`inint`

: input an integer and push it into the stack

`outint`

: pop the top value and print it

`if C, n`

: pop 2 values *a* and *b*. If *a* C *b* then continue, else skip the next *n* instruction(s)

`for n`

: pop a value *A*. Execute the next *n* instruction(s) A time(s)

`while C, n`

: Execute the next *n* instructions while *a* C *b* is true. It pop 2 values at the beginning of the loop. The loop stop if the stack contain less than 2 values.

`stop`

: stop the program

## Matrix form

`+, -, *, /, %, ^`

: all 2x2 matrix where opcode = det % 6

0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|

opcode |
+ | - | * | / | % | ^ |

`push A`

: all non-square matrices (except 2x3)

where *l* and *c* are the number of line and column in the matrix

`copy`

: 1 rank 2x3 matrix

`del`

: 2 rank 2x3 matrix

`swap i, j`

: *(not implemented yet)*

`instr, inint`

: 4x4 orthogonal matrix

`outstr, outint`

: 4x4 non orthogonal matrix

`while`

: 3x3 matrix where the diagonal matrix equivalent have this form :

0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|

C |
< | > | <= | >= | == | != |

`for`

: 3x3 matrix where the triangle matrix equivalent have this form :