请问一下 moonbit 是否会像 golang 一样实现指针类型?

golang 中用指针类型定义数据结构,感觉更能够看出哪些地方是引用,哪些地方是真实数据,

moonbit 中的 enum 定义可以引用自身类型,不知 struct 是否可以内含字段类型属于自身?

目前 MoonBit 的内存模型是,所有带 payload 的 enum 和 struct 都是 reference。struct 可以递归。

2 个赞

请问如果没有指针类型,ffi 中如何表示有指针的接口?

感觉指针和 trait 类型结合就是 trait object,
比如 *ICompare 和 ICompare 可以分别表示 rust 中的 &dyn Trait 和 impl Trait,
感觉这个统一性很美

wasm 中也有指针类型,不知在 moonbit 中如何表达此类型?

你说的wasm中的指针类型是指操作线性内存时的整数参数?

嗯,是的

以及 ffi 中导入的 c lib 中涉及到的指针

对于wasm gc后端,线性内存只不过是块大点的Bytes,因此没有特别的类型。可以自己定义一个基于整数的new type。至于c lib中的指针,则取决于它的ABI。

对于wasm mvp后端,目前还没有方案。

mvp 后端有个特别 hacky 的办法,但是需要手动修改 wat 文件,比如要获取 String 的内存地址,可以先定一个这样的函数:

fn unsafe_string_data(s: String) -> Int = "$moonbit.unsafe_string_data"

然后构建成 wat:

moon build --output-wat

最后修改 .wat 文件,增加 $moonbit.unsafe_string_data 的实现即可:

(func $moonbit.unsafe_string_data
   (param $str i32) (result i32)
  (i32.add (local.get $str) (i32.const 4))
)

但是!这种方法依赖于 --output-wat 不检查 $moonbit.unsafe_string_data 其实 ABI 里没有,所以哪天更新了可能就不能用了(现在似乎也没有稳定 ABI)。