泛型支持
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原生数据类型首字母从原来的小写改成大写,比如 int
→ Int
。
工具链优化
-
Formatter 增加 x:=expr语法糖的支持
-
Formatter 增加 interpolation string 支持
-
Wasm后端支持compare_float和compare_string
-
构建系统支持导入特定版本的lib,比如 moon add --path xxlib:v1
-
构建系统安装脚本增加版本升级功能