See also:
There are eleven types nil, int, float, bool, str, fn(T) -> T, vec<T>, any, structs and enums.
Type of any value can be checked by a built-in function typeof(val: any) -> str.
let v = vec[];
let i: int;
typeof(v); // vec
typeof(i); // int
typeof(
fn (x: int) -> int { // fn(int) -> int
return x;
}
); Represented by only one value, nil itself. Function that does not return a value implicitly returns nil.
fn foo() -> nil {} // same as fn foo() {}Comprises true and false values. Each logic operation, comparison or equality check produces value of type bool.
An int is an integer number. A float is floating point number.
num is a type alias for int|float
Numbers can be compared and used in math operations.
String is series of characters, enclosed in double quotes. Strings can be concatenated using + operator.
Functions can be declared with a name or created as a lambda function. In that case to reuse them you should store them in a variable, immediately invoke them or pass to a function as a callable. See more
Functions are of fn(T) -> T type.
fn inc(x: int) -> int { // typeof(add) = "fn(int) -> int"
return x + 1;
}
let x: fn(int) -> int = inc; // explicit type
let x = inc; // inferred as "fn(int) -> int"
let f = fn() { // typeof(f) = "fn()"
println("hello"); // "-> nil" is omitted
}
let f: fn() -> fn(int) -> str; // function type can be nested
let f = fn ( // inferred as "fn(int, fn(vec<str) -> str) -> str
x: int,
f: fn(x: vec<str>) -> str
) -> str {
// ...
}Vectors or arrays of values. See more
User-defined type. See more
User-defined type. See more
any is a type that wraps all possible types. Variable of type any can be reassigned to any value.
let mut x: any = "string";
x = 45.9;
x = vec[1, 2, 3, 4];any must be explicitly cast before used in an expression
let x: any = 10;
let y = 2 * x as int;Types can be compounded in unions, in this case value must satisfy at least one type.
fn x() -> str|nil {
return "string";
}New type aliases can be created via the type declaration statement
type IntVec = vec<int>;
// works with unions as well
type StrOrIntVec = str|IntVec;Type aliases can be used wherever a type is expected.
type StrOrNil = str|nil;
fn accept_str_or_nil(arg: StrOrNil) { ... }