nilang 0.2.1

A scripting language interpreter for Advent of Code
Documentation
VERSION 0.1.0

IN PROGRESS:
- WASM SUPPORT
  1. Allow Nimix to compile with no_std
  2. update Sandpit to support single threaded/no_std mode
  3. remove std usages from nilang
  4. nimix update
    4.1. make it support being a global allocator
    4.2. have 2 modes linux allcoator, or wasm allocator
  5. Add Wasm bindgens for JS
  6. add a JS wrapper for WASM blob
  7. static or dynamic loading of script files?

BACKLOG:
- BUG: some symbols should not be intrinsic
- LSP
- FFI
  - dynamic & static linking of .so files

OPTIMIZATION/REFACTOR BACKLOG:
- add benchmarking
- strength reduction for mod/mult/div by powers of 2
- const locals for maps and lists
- move span to its own module
- GC updates:
  - GcVecMut
    - goal is to make it so that every call does not require a new callframe to
      be allocated
    - this update should be a big speed up by dramatically reducing number of
      allocations
  - there is some bugs around GcVec still
- string internment
- Memory SSA
- Jump threading pass
- Loop Invariant Code Motion
- Peephole pass
- AST pass
- JIT?

GOALS
- complete AOC 2025 with this language [TODO]
- learn about compilers and interpreters [IN PROGRESS]
- have fun [IN PROGRESS]
- make a game! [TODO]

DECEMBER -> COMPLETE AOC
NOVEMBER
OCTOBER
- added string interpolation
- push and pop operators
- unary operators
- list intrinsic
- auto binding of functions with "self" arg
- for loops

SEPTEMBER
- added backtraces
- re-worked how errors are displayed
- added tests for error messages

AUGUST
- changed how intrinsic functions work
- reorganized some code
- added more tests and examples

JULY
- made an initial draft of intrinsic functions to add
- added partial functions
- implemented top level intrinsic functions
- implemented num intrinsics
- rough draft of importing/exporting

JUNE
- ran first program, and many more
- added intrinsic functions
- added 'pretty' runtime errors
- added lists, strings, closures, & hash maps, and more!
- ran some successful concurrent GC tests
- added global variables

MAY
- dead code elimination
- global value numbering pass 
- register allocation
- first draft of bytecode
- tac updates: 
  - var -> vreg (much smaller!)
- testing via golden files
- beginning to draft out runtime/vm

APRIL
- implemented cfg creation from tac
- implemented converting cfg to ssa form
- added boolean shortcircuiting
- symbol map can convert 2 ways
- completed escape dfa
- cfg printing and graph vizualization

MARCH
- refactored the lexer to be much more functional
- completely redesigned the parser by using parser combinators
  - this gave a huge improvement in readability
- started redesign of the tac generator


THE BEFORE TIMES
- I was working on the garbage collector, Sandpit, and its accompanying
  allocator, Nimix. Development on that I think lasted around 4 or 5 months and
  was slower going as I was still newer to Rust and there was lots more unsafe
  code to wrangle in those crates.