# enum

An `enum` declaration inside a `lib` declares a C enum:

``````lib X
# In C:
#
#  enum SomeEnum {
#    Zero,
#    One,
#    Two,
#    Three,
#  };
enum SomeEnum
Zero
One
Two
Three
end
end
``````

As in C, the first member of the enum has a value of zero and each successive value is incremented by one.

To use a value:

``````X::SomeEnum::One #=> One
``````

You can specify the value of a member:

``````lib X
enum SomeEnum
Ten = 10
Twenty = 10 * 2
ThirtyTwo = 1 << 5
end
end
``````

As you can see, some basic math is allowed for a member value: `+`, `-`, `*`, `/`, `&`, `|`, `<<`, `>>` and `%`.

The type of an enum member is `Int32` by default, even if you specify a different type in a constant value:

``````lib X
enum SomeEnum
A = 1_u32
end
end

X::SomeEnum #=> 1_i32
``````

However, you can change this default type:

``````lib X
enum SomeEnum : Int8
Zero,
Two = 2
end
end

X::SomeEnum::Zero #=> 0_i8
X::SomeEnum::Two  #=> 2_i8
``````

You can use an enum as a type in a `fun` argument or `struct` or `union` members:

``````lib X
enum SomeEnum
One
Two
end

fun some_fun(value : SomeEnum)
end
``````