oakc 0.6.1

A portable programming language with a compact backend
Documentation
#[std]
#[memory(512)]

struct Array {
    let len: num,
        elem_size: &num,
        contents: &void;

    fn new(len: num, elem_size: num) -> Array {
        return [len, elem_size, alloc(len * elem_size)]
    }

    fn idx(self: &Array, n: num) -> &void {
        return self->contents + n * (self->elem_size)
    }

    fn print(self: &Array) -> void {
        prn!(self->len); prc!(',');
        prn!(self->elem_size); prc!(',');
        prn!(self->contents);
        prc!('.');
        prend!();
    }

    fn copy(self: &Array) -> Array {
        let size = (self->len) * (self->elem_size);
        let ptr = alloc(size) as &char;
        let self_ptr = (self->contents) as &char;
        for i in 0..size {
            ptr[i] = self_ptr[i];
        }
        return [self->len, self->elem_size, self_ptr]
    }

    fn drop(self: &Array) -> void {
        free self->contents: ((self->len) * (self->elem_size));
    }
}

struct Date {
    let month: num,
        day: num,
        year: num;

    fn from(ptr: &void) -> &Date { return ptr as &Date }
    fn new(month: num, day: num, year: num) -> Date {
        return [month, day, year];
    }

    fn birthday() -> Date { return Date::new(5, 14, 2002) }

    fn print(self: &Date) -> void {
        prn!(self->month);
        prc!('/');
        prn!(self->day);
        prc!('/');
        prn!(self->year);
        prend!();
    }

    fn yesterday(self: &Date) -> Date {
        self->day = self->day - 1;
        return *self
    }

    fn tomorrow(self: &Date) -> Date {
        self->day = self->day + 1;
        return *self
    }

    fn next_week(self: &Date) -> Date {
        let result: Date = *self;
        for (let i:num=0; i<7; i=i+1) {
            result = result.tomorrow();
        }
        return result
    }

    fn next_month(self: &Date) -> Date {
        self->month = self->month + 1;
        return *self
    }
}

fn main() -> void {
    let arr: Array = Array::new(4, sizeof(Date));
    arr.print();

    *arr.idx(0) = Date::birthday();
    *arr.idx(1) = Date::birthday().tomorrow();
    *arr.idx(2) = Date::birthday().yesterday();
    *arr.idx(3) = (Date::birthday().next_week()).next_month();
    for (let i:num=0; i < arr->len; i=i+1) {
        Date::from(arr.idx(i)).print();
    }
    arr.drop();
}