# Geolang

Geolang is a programming language made by user:TJC games for helping with geometry.

Who am I kidding, it is a stupid language made by a stupid person.

Not affiliated with the other Geolang.

## Usage

The name of an object cannot be or contain `@`, `[`, `]`, `,`, `(`, `)`, or any of the keywords.

All object names have to be unique.

Instead of listing a single object, where specified, you can have a list of objects.

An object list is surrounded by [], and has commas between items.

Any point input in the below table can take a co-ordinate set as well, except from the `point` command.

### Operations

Keyword Usage Mechanic
point point a @ (x, y) Add or move the point called `a` to the co-ordinates (x, y).
point point a @ (x, y) z Add or move the point called `a` to the closest point on object z to the co-ordinates (x, y).
mid mid a @ x y Add a point called `a` to the midpoint of points x and y.
mid mid a @ x Add a point called `a` to the midpoint of segment or arc x.
line line a @ x y Create a line called `a` between points x and y, and extend it infinitely.
ray ray a @ x y Create a line segment called `a` between points x and y, and extend it in the direction of point y.
seg seg a @ x y Create a line called `a` between points x and y.
vect vect a @ x y Create a vector called `a` between points x and y, in the direction of y.
shift shift a @ b x Move point `b` by vector x and call it `a`. Can accept a point for x, where the vector is from (0,0) to the point. Can take a list for b, where it moves all objects.
mirror mirror a @ b x Mirror point `b` along line x and call it `a`. Can accept a point for x, where the line is from (0,0) to the point. Can take a list for b, where it mirrors all objects in the list.
circ circ a @ x y Create a circle called `a` with the centre on point x and the edge on point y.
circ circ a @ x y z Create a circle called `a` touching all points x, y, and z.
arc arc a @ x y z Create an arc called `a` with the centre on x and the ends on points y and z, going clockwise.
poly poly a @ [i, j, k, l...] Create a polygon called `a` with vertices i, j, k, l, and so on (min. 3 arguments).

#### Animations

Time to make this a contender to Manim. If any anim commands exist in the code, the objects don't draw automatically. If any normal commands exist after an anim command, throw an error.

Keyword Usage Mechanic
var var t @ s Creates a variable called `t` and starts it at `s`. Can be used as a number.
latex latex txt @ z Parse text `z` as a LaTeX string and output as txt.
anim var anim t @ var l z ease Animate the graph with variable `t` at a speed of `l` per second up to `z`, with optional easing. Modifies all objects accordingly.
anim shift anim a @ shift v t ease Translate object `a` by vector `v`, with optional length of animation and easing. Keeps objects from `point a @ (x, y) z` on object `z`. `a` can be a list, `v` can be a point as a vector from origin, blah blah blah.
anim mirror anim a @ mirror v t ease Mirror object `a` by vector `v`, with optional length of animation and easing. Keeps objects from `point a @ (x, y) z` on object `z`. `a` can be a list, `v` can be a point as a vector from origin, blah blah blah.
anim wait anim wait @ t Wait `t` seconds.
anim create anim a @ create t ease Create object `a` in `t` seconds, with an optional method.
anim remove anim a @ remove t ease Remove object `a` in `t` seconds, with an optional method.

## Examples

### Hello world

Hello world programs are technically considered impossible in this language because the output is non-textual. However, there may be alternatives.

If you really wanted to, you could do this:

```seg h1 @ (0,0) (0,4)
seg h2 @ (2,0) (2,4)
seg h3 @ (0,2) (2,2)

point e1 @ (3,0)
point e2 @ (3,4)
seg e3 @ e1 e2
seg e4 @ e1 (5,0)
seg e5 @ e2 (5,4)
seg e6 @ (3,2) (5,2)

point l11 @ (6,0)
seg l12 @ l11 (6,4)
seg l13 @ l11 (8,0)

point l21 @ (9,0)
seg l22 @ l21 (9,4)
seg l23 @ l21 (11,0)

seg o11 @ (12,0) (14,0)
seg o12 @ (12,4) (14,4)
seg o13 @ (12,0) (12,4)
seg o14 @ (14,0) (14,4)

point w1 @ (0,-5)
point w2 @ (4,-5)
seg w3 @ w1 w2
seg w4 @ w1 (0,-1)
seg w5 @ (4,-1)
seg w6 @ (2,-5) (2,-3)

seg o21 @ (3,-5) (5,-5)
seg o22 @ (3,-1) (5,-1)
seg o23 @ (3,-5) (3,-1)
seg o24 @ (5,-5) (5,-1)

point r1 @ (6,-1)
point r2 @ (8,-1)
point r3 @ (8,-3)
seg r4 @ r1 r2
seg r5 @ r2 r3
seg r6 @ r1 (6,-5)
seg r7 @ r3 (6,-3)
seg r8 @ (7,-3) (8,-5)

point l31 @ (9,-5)
seg l32 @ l31 (9,-1)
seg l33 @ l31 (11,-5)

seg d1 @ (12,-1) (12,-5)
seg d2 @ (12,-5) (13,-5)
seg d3 @ (13,-5) (14,-4)
seg d4 @ (14,-4) (14,-2)
seg d5 @ (14,-2) (13,-1)
seg d6 @ (13,-1) (12,-1)```

### Truth machine

It is impossible, proving that this language is not turing complete. Cite: This article

Things Geolang doesn't have: IO, math, loops