golang 中用指针类型定义数据结构,感觉更能够看出哪些地方是引用,哪些地方是真实数据,
moonbit 中的 enum 定义可以引用自身类型,不知 struct 是否可以内含字段类型属于自身?
golang 中用指针类型定义数据结构,感觉更能够看出哪些地方是引用,哪些地方是真实数据,
moonbit 中的 enum 定义可以引用自身类型,不知 struct 是否可以内含字段类型属于自身?
目前 MoonBit 的内存模型是,所有带 payload 的 enum 和 struct 都是 reference。struct
可以递归。
请问如果没有指针类型,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)。