mirror of https://github.com/fredrikekre/EnumX.jl
1 changed files with 124 additions and 2 deletions
@ -1,3 +1,125 @@ |
|||||||
# EnumX |
# EnumX.jl |
||||||
|
|
||||||
`Base.@enum`s protected by a module scope. |
This is what I wish [`Base.@enum`][at-enum] was. |
||||||
|
|
||||||
|
## Usage |
||||||
|
|
||||||
|
EnumX exports the macro `@enumx`, which works similarly to `Base.@enum`, but with |
||||||
|
some improvements. |
||||||
|
|
||||||
|
The main drawback of `Base.@enum` is that the names for instances |
||||||
|
are *not* scoped. This means, for example, that it is inconvenient to use "common" names |
||||||
|
for enum instances, and it is impossible to have multiple enums with the same instance |
||||||
|
names. |
||||||
|
|
||||||
|
`EnumX.@enumx` solves these limitations by putting everything behind a module scope such |
||||||
|
that instances are hidden and instead accessed using dot-syntax: |
||||||
|
|
||||||
|
```julia |
||||||
|
julia> using EnumX |
||||||
|
|
||||||
|
julia> @enumx Fruit Apple Banana |
||||||
|
|
||||||
|
julia> Fruit.Apple |
||||||
|
Fruit.Apple = 0 |
||||||
|
|
||||||
|
julia> Fruit.Banana |
||||||
|
Fruit.Banana = 1 |
||||||
|
``` |
||||||
|
|
||||||
|
`Fruit` is a module -- the actual enum type is defined as `Fruit.Type`: |
||||||
|
|
||||||
|
```julia |
||||||
|
julia> Fruit.Type |
||||||
|
Enum type Fruit.Type <: Enum{Int32} with 2 instances: |
||||||
|
Fruit.Apple = 0 |
||||||
|
Fruit.Banana = 1 |
||||||
|
|
||||||
|
julia> Fruit.Type <: Base.Enum |
||||||
|
true |
||||||
|
``` |
||||||
|
|
||||||
|
Since the only reserved name in the example above is the module `Fruit` we can create |
||||||
|
another enum with overlapping instance names (this would not be possible with `Base.@enum`): |
||||||
|
|
||||||
|
```julia |
||||||
|
julia> @enumx YellowFruits Banana Lemon |
||||||
|
|
||||||
|
julia> YellowFruits.Banana |
||||||
|
YellowFruits.Banana = 0 |
||||||
|
``` |
||||||
|
|
||||||
|
`@enumx` also allows for duplicate values: |
||||||
|
|
||||||
|
```julia |
||||||
|
julia> Fruit.Type |
||||||
|
Enum type Fruit.Type <: Enum{Int32} with 2 instances: |
||||||
|
Fruit.Apple = 1 |
||||||
|
Fruit.Banana = 1 |
||||||
|
|
||||||
|
julia> Fruit.Apple |
||||||
|
Fruit.Apple = Fruit.Banana = 1 |
||||||
|
|
||||||
|
julia> Fruit.Banana |
||||||
|
Fruit.Apple = Fruit.Banana = 1 |
||||||
|
``` |
||||||
|
|
||||||
|
`@enumx` also lets you use previous enum names for value initialization: |
||||||
|
```julia |
||||||
|
julia> @enumx Fruit Apple Banana Orange=Apple |
||||||
|
|
||||||
|
julia> Fruit.Type |
||||||
|
Enum type Fruit.Type <: Enum{Int32} with 3 instances: |
||||||
|
Fruit.Apple = 0 |
||||||
|
Fruit.Banana = 1 |
||||||
|
Fruit.Orange = 0 |
||||||
|
``` |
||||||
|
|
||||||
|
Other than that, functionality should be comparable to `Base.@enum`: |
||||||
|
|
||||||
|
- Base type specification (defaults to `Int32`): |
||||||
|
```julia |
||||||
|
julia> @enumx Fruit::UInt8 Apple Banana |
||||||
|
|
||||||
|
julia> typeof(Integer(Fruit.Apple)) |
||||||
|
UInt8 |
||||||
|
``` |
||||||
|
|
||||||
|
- Specifying values (if not specified, defaults to the value of the previous instance + 1): |
||||||
|
```julia |
||||||
|
julia> @enumx Fruit Apple=4 Banana=(1 + 5) Orange |
||||||
|
|
||||||
|
julia> Fruit.Type |
||||||
|
Enum type Fruit.Type <: Enum{Int32} with 3 instances: |
||||||
|
Fruit.Apple = 4 |
||||||
|
Fruit.Banana = 6 |
||||||
|
Fruit.Orange = 7 |
||||||
|
``` |
||||||
|
|
||||||
|
- Definition with `begin`/`end` block: |
||||||
|
```julia |
||||||
|
julia> @enumx Fruit begin |
||||||
|
Apple |
||||||
|
Banana |
||||||
|
Orange |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
## See also |
||||||
|
|
||||||
|
**Community discussions** |
||||||
|
- [Encapsulating enum access via dot syntax][discourse-1] |
||||||
|
- [Can not reuse enum member in different member][discourse-2] |
||||||
|
- [Solving the drawbacks of `@enum`][discourse-3] |
||||||
|
|
||||||
|
**Related packages** |
||||||
|
- [CEnum.jl][CEnum]: C-compatible Enums. |
||||||
|
- [SuperEnum.jl][SuperEnum]: Similar approach as EnumX, but doesn't give you `Base.Enum`s. |
||||||
|
|
||||||
|
|
||||||
|
[at-enum]: https://docs.julialang.org/en/v1/base/base/#Base.Enums.@enum |
||||||
|
[discourse-1]: https://discourse.julialang.org/t/encapsulating-enum-access-via-dot-syntax/11785 |
||||||
|
[discourse-2]: https://discourse.julialang.org/t/cannot-reuse-enum-member-in-different-enum/21342 |
||||||
|
[discourse-3]: https://discourse.julialang.org/t/solving-the-drawbacks-of-enum/74506 |
||||||
|
[CEnum]: https://github.com/JuliaInterop/CEnum.jl |
||||||
|
[SuperEnum]: https://github.com/kindlychung/SuperEnum.jl |
||||||
|
|||||||
Loading…
Reference in new issue