Cinder by Example

Cinder is small programming language for low-level development.

Enums

An enum is a type with named variants.

use "std/io.cnd";

enum Color {
    Red;
    Green;
    Blue;
}

fn name(c: Color) -> []u8 {
    switch c {
        Color.Red => { return "red"; }
        Color.Green => { return "green"; }
        Color.Blue => { return "blue"; }
    }
}

fn main() -> i32 {
    println(name(Color.Red));
    println(name(Color.Green));
    println(name(Color.Blue));
    return 0;
}
$ ./enums
red
green
blue

Dot shorthand

When the type is known, the variant can be written as .Variant.

use "std/io.cnd";

enum Direction {
    North;
    East;
    South;
    West;
}

fn arrow(d: Direction) -> []u8 {
    switch d {
        .North => { return "^"; }
        .East => { return ">"; }
        .South => { return "v"; }
        .West => { return "<"; }
    }
}

fn main() -> i32 {
    println(arrow(Direction.East));
    println(arrow(.West));
    return 0;
}
$ ./shorthand
>
<

Enums in errors

An enum is the natural error type. Returning a variant from a !T function

signals an error. See Optionals and Errors.

enum IoError {
    NotFound;
    PermissionDenied;
    DeviceBusy;
}

Enums are plain values

An enum value is stored as its variant index. Use switch to branch.

Converting an enum to its index is an unsafe cast:

unsafe {
    let idx = Color.Blue as i32;   // 2
}