In C code we often use enums to represent constants like so:
enum TokenType { TOK_OFS = 256, TOK_and, TOK_break, TOK_STRING, FIRST_RESERVED = TOK_OFS + 1, LAST_RESERVED = TOK_while - TOK_OFS };
Rust also has an enum type but it is not at all like the C enum. The Rust enum is more like a discriminated union in C.
Superficially though you can almost write something like above in Rust.
enum TokenType { TOK_OFS = 256, TOK_and, TOK_break, TOK_STRING, FIRST_RESERVED = TOK_OFS + 1, LAST_RESERVED = TOK_while - TOK_OFS }
But this will not compile. Firstly Rust expects explicit conversion from enum to int, so you can try:
enum TokenType { TOK_OFS = 256, TOK_and, TOK_break, TOK_STRING, FIRST_RESERVED = TOK_OFS as isize + 1, LAST_RESERVED = TOK_while as isize - TOK_OFS as isize }
However this will not work either because an enum in Rust is not really a constant. The enum discriminant value needs to be unique so we cannot have two instances TOK_and
and FIRST_RESERVED
with the same value.
Perhaps we could try this:
enum TokenType { TOK_OFS = 256, TOK_and, TOK_break, TOK_STRING, } const FIRST_RESERVED :isize = TOK_OFS as isize + 1; const LAST_RESERVED: isize = TOK_while as isize - TOK_OFS as isize;
This compiles, but the enums are a pain to use as constants because of the need to explicitly convert to integer values.
In the end I ended up doing:
const TOK_OFS: i32 = 256; const TOK_and: i32 = 257; const TOK_break: i32 = 258; const TOK_STRING: i32 = 301; const FIRST_RESERVED: i32 = TOK_OFS + 1; const LAST_RESERVED: i32 = TOK_while - TOK_OFS;
Not great but it gives me what I need.
No comments:
Post a Comment