本周 MoonBit 新增类型标注语法、继续进行核心库 API 整理工作

16次阅读

共计 928 个字符,预计需要花费 3 分钟才能阅读完成。

MoonBit 更新

  • 类型标注增加了新的语法T? 来表示Option[T]
struct Cell[T] {
  val: T
  next: Cell[T]?
}

fn f(x : Cell[T]?) -> Unit {...}

相当于

struct Cell[T] {
  val: T
  next: Option[Cell[T]]
}

fn f(x : Option[Cell[T]]) -> Unit {...}

旧的 Option[T] 仍然兼容,但是推荐使用更简短的新语法。moonfmt 也会将 Option[T] 格式化为T?

  • 核心库 API 整理工作继续进行

    • Iter 包被合入了 builtin 包。现在使用 Iter[T] 不需要 @iter. 前缀
pub fn any[T](xs : Iter[T], predicate : (T) -> Bool) -> Bool {
                // ^ 不需要 @iter.
  match xs.find_first(predicate) {None => false
    Some(_) => true
  }
}
  • Stack包被移入moonbitlang/x
  • 移除了 List 包,以及各类数据结构的 to_listfrom_list函数。对于数据结构间转换和中间的表示结构,推荐使用 Iter[T]Array[T]
  • 性能提升

    • 编译器现在会在分离编译的阶段进行一部分的闭包转化,从而改进了编译性能,并且对 JavaScript 后端生成的代码在特定情况下也进行了闭包转化
    • Option[Bool], Option[Char], Option[Byte], Option[Unit] 这些类型使用 32 位整数表示,其中 None 对应的值为 -1, Some(x) 对应的值为 x; Option[Int] 类型在 wasm 后端使用 64 位整数表示,其中 None 对应的值为 0x1_0000_0000, Some(x) 对应的值为 x, Option[Int]在 JavaScript 后端使用 int | undefined 表示,其中 undefined 表示 None
  • abort行为变更

    • 为了解除 Wasm 程序对于非标准的 spectest.print_char 的依赖,正在重构错误输出功能。
    • abort将不会利用 spectest.print_char 打印错误信息,行为与 panic 相同,等待功能进一步完善。

插件更新

  • [语言服务器] 修复了内存泄露的问题
正文完
 0