OOLANG 0.1.0

An esoteric stack-based programming language, where all instructions are different variations of the character 'O'
Documentation
# OOLANG

![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/RNM-Enterprises/oolang/CI/main?style=for-the-badge)

OOLANG is an esoteric stack-based programming language where all instructions/commands are differnet unicode O characters

## Usage


We have a custom Web IDE at <https://oolang.tech>, for experimenting in the browser.

You can also install OOLANG on your system with Cargo:

```rust
cargo install oolang
```

OOLANG files end in `.oo`, and consist of a number of commands specified each by a single unicode glyph. Any other character is ignored. Comments are supported using the `#` character, which comments out up to the end of the line.

`oorun file.oo` will execute your OOLANG program, reading from `stdin` and outputting to `stdout`.

## Language Specification


OOLANG emulates a [stack machine](https://en.wikipedia.org/wiki/Stack_machine), not dissimilar to how the JVM or Python's bytecode interpreter works.

The virtual machine consists of a stack of bytes, and 256 bytes of addressable memory. A valid OOLANG program may consist of any combination of the the following 10 commands:

| Command | Unicode Character Name                       | Command Name | Description                                                                                 |
| ------- | -------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------- |
| `O`     | Latin Capital Letter O                       | `PUSH`       | Push the value `1` onto the top of the stack                                                |
| `0`     | Digit Zero                                   | `POP`        | Pop the value from the top of the stack, discarding it                                      |
| `วพ`     | Latin Capital Letter O with Stroke and Acute | `INC`        | Pop the top stack value, increment it, push the result                                      |
| `แซ`     | Cherokee Letter Wi                           | `DEC`        | Pop the top stack value, decrement it, push the result                                      |
| `โญ•`    | Heavy Large Circle                           | `ADD`        | Pop the top two stack values, add them, push the result                                     |
| `๐‰`     | Gothic Letter Othal                          | `JNZ`        | Jump to the address at the top of the stack, if the 2nd-top value is non-zero               |
| `๊Œ`     | Latin Capital Letter O with Loop             | `JZ`         | Jump to the address at the top of the stack, if the 2nd-top value is zero                   |
| `โ—Ž`     | Bullseye                                     | `LOAD`       | Pop from the stack, and push the value at the memory address specified                      |
| `โ—ฏ`     | Large Circle                                 | `STORE`      | Pop the top two values from the stack, storing the 2nd at the address specified by the 1st  |
| `โ’ช`     | Parenthesized Latin Small Letter O           | `READ`       | Read the next byte from stdin, pushing it to the top of the stack, or `0` if stdin is empty |
| `โ‚’`     | Latin Subscript Small Letter O               | `WRITE`      | Pop from the stack and write the value to stdin as an ascii character                       |

## Architecture


The language and interpreter are written in Rust. The compiled binary executable acts as a command line program, but the interpreter crate also exposes a public API. When compiled to webassembly, this API is used to provide functionality for the Web IDE within the browser.