Getting Started
Installation
You can install Oxynium on any Linux/MacOS system by running the following command in your terminal:
curl -sSL https://oxynium.org/scripts/install | bash
Unstable version
You can also install the latest version by passing the latest argument to the installation
script.
curl -sSL https://oxynium.org/scripts/install | bash -s -- latest
Requirements
Oxynium will require cargo, rust, nasm and gcc to be installed on your system.
Upgrade
To upgrade to the latest version of Oxynium, run the installation script:
curl -sSL https://oxynium.org/scripts/install | bash
Uninstallation
You can uninstall Oxynium by running the following command in your terminal:
curl -sSL https://oxynium.org/scripts/uninstall | bash
Examples
These are a few simple examples which showcase some of the language's features.
Hello, World!
print("Hello, World!")
Fibonacci
const N = 10;
def fib (n: Int) Int {
    if n <= 1 {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}
print(fib(N).Str()); // 55
FizzBuzz
def main() {
    for i in range(100) {
        print(fizzbuzz(i));
    }
}
def fizzbuzz (n: Int) Str {
    if n % 3 == 0 && n % 5 == 0 {
        return "FizzBuzz";
    }
    if n % 3 == 0 -> return "Fizz";
    if n % 5 == 0 -> return "Buzz";
    return n.Str();
}
Generic classes
class LoggedQueue<T> {
    backing_list: List<T>,
    
    def make_empty<S>()
        -> new LoggedQueue<S> { backing_list: List.empty!<S>() },
    
    def push(self, item: T) LoggedQueue<T> {
        self.backing_list.push(item);
        print("added item " + self.len().Str());
        return self;
    }
    
    def pop(self) T {
        if self.len() < 1 -> panic("pop on empty list");
        let val = self.backing_list.remove_at(0).unwrap();
        print("popped item " + self.len().Str());
        return val;
    }
    
    def len(self) ->
        self.backing_list.len()
}
def main() {
    let q = LoggedQueue.make_empty!<Int>()
                       .push(5)
                       .push(6);
    
    print("process: " + q.pop().Str()); // 5
    print("then: " + q.pop().Str()); // 6
}
Functions
def my_function (param: Int) Int {
    return param * 9
}
equiv to
let my_function = fn (param: Int) -> param * 9
Note that let can only be used inside a function definition,
so this definition cannot be used at the top level
Classes
class MyClass {
    name: Str,
    
    def my_instance_method(self) {
        print("hi from " + self.name)
    }
    
    def my_static_method() {
        // no access to 'name' from here
        print("hi from MyClass")
    }
}
Primitives
Primitives are like classes, except they can only hold one 64-bit value, and are not stored as a reference.
There are several built-in primitives: Int, Char, Bool, Ptr.
Other primitives generally should not be created: instead use classes.
primitive MyPrimitive {
    // cannot declare fields on primitives,
    // only methods and static methods
    
    def do_something(self) {}
    def something_static() {}
}