跳转至

动态类型

Lumos 中可以使用动态类型,变量的类型在运行时确定,就像 js 那样。
即变量可以在不同的时间点存储不同类型的值。
当然我们不建议你在 Lumos 中过多使用动态类型,因为这会导致代码难以理解和维护。

我知道你在想什么

list() + map() 不会得到 "[object Object]",别试了。

obj a = 10;  // 现在 a 为 i32 类型
a     = 0.1; // 现在 a 为 f32 类型
a     = "1"; // 现在 a 为 str 类型

对动态类型成员的访问都会被封装为对哈希表的访问。

a.xxx(); // ((void (*)())a.members["xxx"])();

使用 typeof 运算符可以获取它的类型。
使用 typenameof 运算符可以以字符串形式获取它的类型。

obj a = 10;
println(typenameof(a)); // i32

如果不初始化动态类型对象,那么它的类型为 void,值为 undefined

obj a;         // 不初始化
a == undefined; // true
typeof(a);      // void

锁定动态类型对象的类型

fn my_func(obj arg1 @lock-type) {
  arg1 = 1; // 此时 arg1 的类型并不会变为 `int`
            // 而是会调用 `arg1` 原类型的构造函数
}

优先考虑使用重载与模板

@<typename T>
fn my_func(T arg1) {
  arg1 = 1;
}

实现

实际上就是将运算符进行封装。
类似以下 C 代码。

typedef struct object *object_t;
typedef object_t (*op1_t)(object_t *);
typedef object_t (*op2_t)(object_t *, object_t *);
typedef struct callbacks {
    op2_t add;
    op2_t sub;
    op2_t mul;
    op2_t div;
} *callbacks_t;
struct object {
  callbacks_t cbs;
};
a = a.cbs->add(a, b);