chibi 0.1.0

Name reserved for a programming language project.
Documentation
## Features
Rust-like borrow checker:  
- Variables are moved by default  
  ```
  let a = 5
  let b = a
  print(a) // Error: 'a' has been moved -> b = a
  ```

- Anonymous union type
  ```
  let a: int | str = 5
  if a is int {
      print("a is an integer") // Here 'a' is treated as int
  } else {
      print("a is a string") // Here 'a' is treated as str
  }

  match a {
      int => print(a), // Here 'a' is treated as int
      str => print(a), // Here 'a' is treated as str
  }
  ```

- Named union
  ```
  enum Colors {
      Red,
      Blue,
      Green,
  }
  

  let color = Colors::Red

  if color is Colors::Blue {
      ...
  } else if color is Colors::Red {
      ...
  } else {
      ...
  }
  ```

- Named union with associated value
  ```
  enum Colors {
      Red: (int, int, int),
      Green: (int, int, int),
      Blue: (int, int, int),
  }
  
  let color = Colors::Blue(0, 0, 255)
  match color {
      Colors::Blue => ... // color is treated as an (int, int, int) tuple
  }
  ```

  If all associated values are of the same type, it can be written this way
  ```
  enum Colors: (int, int, int) {
      Red,
      Blue,
      Orange
  }
  ```

  Associated values can be assigned as constants
  ```
  enum Colors {
      Red = (255, 0, 0),
      Green = (0, 255, 0),
      Blue = (0, 0, 255),
  }

  let color = Colors::Red
  print(color) // Colors::Red(255, 0, 0)
  ```



## Functions
Like Haskell, but with optional brackets.  
Also, there is optional typing before the function definition, and optional argument naming.
    
    factorial :: Int -> Int :: num
    factorial 0 = 1
    factorial n = n * factorial (n - 1)
    
    factorial n = {
        ret acc = 1;
        for n in 0..n {
            acc *= n;
        }
    }

> A variable marked with `ret` will be returned when the function ends.


mut acc = 55 // mutable  
let acc = 65 // immutable  
ret acc = 88 // mutable and will be returned  


## AST
// Statements return None

Expression {

}

Program
  - Statement
    - Let
      - Name: "..."
      - Type?: Type::...
      - Value: Expression::...
  - Expr
    - Literal
      - String: "Hello!"