Basic Types
Some of this is as of yet TBD, but the following basic types are planned:
// Miscellaneous
void
noreturn // encodes __attribute__((noreturn)) and similar
bool
null_t // the type of `null`; TBD: what to name this keyword? (again, I dislike ones ending with _t)
// TODO: Actual name of type?
dynamic // top type, essentially a boxed/variant type with some magic attached to it
// Character Types
char // equivalent to uint8_t in representation, but a separate type for clarity
wchar // reserved; uint16_t-based
dchar // reserved; uint32_t-based
// note that strings are simply immutable `char[]`
// TODO: Should strings be a separate type in their own right? Could make `char` 32-bit, or even a higher-level grapheme cluster type in that case (but grapheme clusters imply single Unicode version dependency).
// Integers
// TODO: Should we use [u]int{8,16,32,64,128} instead?
byte ubyte // 8-bit
short ushort // 16-bit
int uint // 32-bit
long ulong // 64-bit
cent ucent // reserved; 128-bit
// Floating-Point Types
// TBD: reserve keywords for half-float and quad-float?
float // 32-bit
double // 64-bit
real // TBD; likely to be "implementation-defined" (typically 32-bit or 64-bit, depending on what it's embedded in)
// Common Aliases (technically part of an implicitly-imported module, though some may become keywords)
string // immutable char[]
mstring // char[]
asize_t // a type that can store the longest arrays; might not necessarily be the same as `uintword`, as this may be reduced
intword uintword // sort of like [u]intptr_t, a type large enough to store certain useful things; always 64-bit in VM, but e.g. JavaScript, WebASM, or native builds may be 32-bit in some cases.
// TODO: Should we have a `bigint` in core?
// Also: Someone did suggest replacing `int` with it (and renaming "old" int to `int32`, etc), but I dislike the performance implications of the replacement.