Moonbit每周工作动态-0731

泛型支持

Moonbit增加对泛型的支持,完整的例子可以参考playground的 012_avl_stree.mbt。

语法上,通过类型构造器的 [] 来定义泛型,比如定义一个AVL树:

enum T[U] {
  Empty
  Node (T[U], U, T[U], Int)
}

那么对这个泛型type做操作的函数也需要加上对应 [] 到函数名字后面,比如:

func height[U](self: T[U]) -> Int {
  match self {
    Empty => 0
    Node(_, _, _, h) => h
  }
}

如果需要用到泛型type的接口,比如 Compare,则需要把冒号以及具体的接口名放到泛型后面,比如我们要用到类型的Compare,可以这样写

func add[U:Compare](self: T[U], x: U) -> T[U] {
  match self {
    Empty => Node(Empty, x, Empty, 1)
    Node(l, v, r, _) as t => {
      let c = x.compare(v)
      if c == 0 {
        t
      } else if c < 0 { bal(l.add(x), v, r) } else { bal(l, v, r.add(x)) }
    }
  }
}

如果函数需要用到超过1个接口,也可以用加号链接起来,比如下面例子的[U:Compare+Show]:

func remove[U:Compare+Show](self: T[U], x: U) -> T[U] {
..
}

原生数据类型支持如下接口:

  • Compare

  • Eq

  • Hash

  • Show(这里代指 to_string)

对于非原生类型,用户也可以定义对应的接口,比如下面例子是一个自定义的结构体,里面包含2个整数元素。结构体的对比需要对比2个元素之和:

struct TN {
  val1 : Int
  val2 : Int
}

func compare(self : TN, other : TN) -> Int {
  if self.val1 + self.val2 > other.val1 + other.val2 {
    return 1
  } else if self.val1 + self.val2 < other.val1 + other.val2 {
    return -1
  } else {
    return 0
  }
}

支持对数组的模式匹配

Moonbit 增加了对数组的模式匹配,通过语法 .. 表达剩余部分,比如:

func init {
  let a : Array[Int] = [1, 2, 3, 4]
  match a {
    [ hd, .. ] => hd.print() // 1
    [  ] => "empty".print()
  }
  
  match a {
    [ .., tail ] => tail.print() // 4
    [  ] => "empty".print()
  }
  
  match a {
    [single] => "single:\(single)".print()
    [ _,second, .. ] => "second:\(second)".print() // second:2
    [  ] => "empty".print()
  }
}

扩展名修改

为了后续更好的训练AI模型,结合AI以及Moonbit的类型系统帮助用户更快速的实现代码,Moonbit语言文件后缀名从原来和其他脚本语言有所交集的 .moon 修改成 .mbt

原生类型首字母大写

Moonbit原生数据类型首字母从原来的小写改成大写,比如 intInt

工具链优化

  1. Formatter 增加 x:=expr语法糖的支持

  2. Formatter 增加 interpolation string 支持

  3. Wasm后端支持compare_float和compare_string

  4. 构建系统支持导入特定版本的lib,比如 moon add --path xxlib:v1

  5. 构建系统安装脚本增加版本升级功能

@Hoey 好奇泛型符号为什么使用了[]而不是比较传统的<>

更早拥有泛型,开发者比较多的语言如C#, Java, TypeScript 的泛型符号都是<>

而其他流行语言如Go, Python这些都是近期才有了泛型语法符号[]

选择更多人熟悉的语法符号,是否更利于让开发者上手?

还是说有其他考虑?比如影响编译速度?

1 个赞

这里有一篇文章解释的比较好

3 个赞

一点小小的个人意见:POPL people are more interested in type systems and semantics than they are in syntax. :slight_smile: