类型与数据
Kelyra 把类型写在名称之后:name: Type。局部变量也可以从初始值推导类型。
内置类型
| 类别 | 类型 |
|---|---|
| 有符号整数 | i8、i16、i32、i64、i128、isize |
| 无符号整数 | u8、u16、u32、u64、u128、usize |
| 浮点数 | f32、f64;f128 等更宽类型的支持范围有限 |
| 其他 | bool、char |
isize 和 usize 随目标平台指针宽度变化。char 表示 Unicode 标量值。f256 和 f512 目前只能用于部分签名场景,不能用于普通字面量或算术。
数组、切片与指针
定长数组写作 [4]i32,切片写作 []i32,只读切片写作 []const i32。原始指针写作 *i32。
kelyra
fn first(values: []const i32) -> i32 {
return values[0];
}切片由地址和长度组成,可用 .len 读取长度。切片索引与范围会做边界检查。原始指针可用 & 取地址、* 解引用;编译器目前不进行借用或生命周期检查。
完整切片示例来自编译器测试:
kelyra
fn sum(values: []const i32) -> i32 {
let total: i32 = 0;
let i: usize = 0;
while i < values.len {
total = total + values[i];
i = i + 1;
}
return total;
}
fn update(values: []i32) {
values[0] = 10;
}
@main
fn main() -> i32 {
let values: [4]i32;
values[0] = 1;
values[1] = 2;
values[2] = 3;
values[3] = 4;
let middle: []i32 = values[1: 3];
update(middle);
let first: []const i32 = values[: 2];
let last: []const i32 = values[2:];
let all: []const i32 = values[:];
if middle.len != 2 || first.len != 2 || last.len != 2 || all.len != 4 {
return 1;
}
if sum(all) != 18 || sum(middle[: 1]) != 10 {
return 2;
}
return 0;
}类型别名与泛型类
alias 定义透明类型别名;类可以带类型参数。
kelyra
alias Count = i32;
class Box<T> {
value: T;
pub init(value: T) { this.value = value; }
}别名与目标类型可以直接互用。泛型能力还在扩展,同名泛型函数模板目前不能重载。