nessa-language 0.9.1

An extensible programming language with a strong type system
Documentation
class Dice {
    /*
        This syntax is used automatically in the code.
        The arguments are parsed as the corresponding types and 
        assigned as needed
    */
    syntax from Arg(1{d}, rolls) "D" Arg(1{d}, sides);

    rolls: Int;
    sides: Int;
}

fn roll(dice: @Dice) -> Int {
    let res: Int = 0;
    let it: Int = 0;

    while it < dice.rolls {
        res = res + rand_int(1, dice.sides);
        it.inc();
    }

    return *<Int>res;
}

let d1: Dice = 2D20;
let d2: Dice = 5D6;
let d3: Dice = 9D10;

if d1.rolls != 2 || d1.sides != 20 {
    panic("Invalid d1");
}

if d2.rolls != 5 || d2.sides != 6 {
    panic("Invalid d2");
}

if d3.rolls != 9 || d3.sides != 10 {
    panic("Invalid d3");
}

let it: Int = 0;

while it < 1000 {
    let r: Int = d3.roll();

    if r < d3.rolls || r > d3.rolls * d3.sides {
        panic("Invalid roll");
    }

    it.inc();
}

class InnerDice {
    syntax from "[" Arg(1{d} "D" 1{d}, inner_dice) "]";

    inner_dice: Dice;
}

let id: InnerDice = [7D4];

if id.inner_dice.rolls != 7 || id.inner_dice.sides != 4 {
    panic("Invalid inner dice");
}