**MatRepl** * is a Matrix * and a repl: Read–Eval–Print Loop, where Print is doing operations on vectors and matrices in a graphic environment * written in vanilla javascript (ES6) * see live at https://matrepl.net ![add 2 vectors](screenshot.png? "add 2 vectors") The repl has the following syntax (It's work in progress, new capabilities will be added) * arithmetic expressions: * add(+), subtract(-), divide(/), multiply(*) on scalars, vectors and matrices. * variable declaration eg: ```a = 1 + 2``` * ```remove(x)``` removes bindings (when it's an object (eg vector), removes it from the matrix) * ```remove(@n)``` removes an object using it's assigned index (```n``` is a number) * By the way, values can be bound to a name (assigned to a variable), but you can always also refer to them using their id, using : ```@n``` * so ```a = vector(1,1)``` > > vector@0{x0:0, y0: 1, x:1, y:1} * and then ```@0``` > > vector@0{x0:0, y0: 1, x:1, y:1} * method calls: ```a = vector(12, 1)``` works as well. The start is now the origin. > > vector@0{x0:0, y0: 2, x:12, y:1} ```vector(-1 -1)``` != ```vector(-1-1)``` and the latter would mean ```vector(-2)``` which is not legal. * arrays: \[i0, i1, i2, ... in] creates an array. * \[i0, i1] is special: it is a shorthand for creating a 2-dimensional vector. I'll have to think of another way to create an array of length 2... * ```id()`` adds a 2d identity matrix, which is also the two basis vectors. * properties * ```a = [1,2]``` * ```a.type``` > > vector * ```a.x+1``` > > 13 * drag vectors using the mouse pointer. You can change the vector arrows visually * lazy evaluation. The difference between ```c = a+b``` and ```c = "a+b"``` is that the latter assigns to ```c``` a parsed expression that can always be evaluated later. When you apply lazy evaluation and later update ```a```, the value for c will be reevaluated automatically. Combined with vector dragging, this way you can get an intuition for vector addition. Want to do the same for matrix multiplication and basis change. * Example: enter the following, like in the screenshot: ``` a = vector(0.5, 0.5) b = vector(-1, 1) c = "a + b" ``` * and press enter. Then using the mouse pointer move vector ```a``` or ```b```. Or try: ```a = 2 * a``` This updates vector ```a``` to twice it's size. And, because ```c``` is defined lazily, it is updated as well! **To run locally** * make sure you have node/npm * cmdline: npm run start * and enter ```help()```