weekly 2024-04-22
MoonBit更新
- 标准库里添加了 Iter 类型,该类型可以高效地对容器中的元素的进行访问,并且将访问过程优化成循环,使用方式比如:
test "iter" {
let sum = Iter::[1, 2, 3, 4, 5, 6]
.filter(fn { x => x % 2 == 1 })
.take(2)
.map(fn { x => x * x})
.reduce(fn (x, y) { x + y }, 0)
inspect(sum, content="10")?
}
- 标准库里添加了VecView类型,可以使用如下方式对
Vec[T]
类型的值取它的VecView[T]
。
test "view" {
let v = Vec::[1, 2, 3, 4, 5]
let vv1 = v[..]
let vv2 = v[1..]
let vv3 = v[..4]
let vv4 = v[1..4]
inspect(vv1, content="VecView::[1, 2, 3, 4, 5]")?
inspect(vv2, content="VecView::[2, 3, 4, 5]")?
inspect(vv3, content="VecView::[1, 2, 3, 4]")?
inspect(vv4, content="VecView::[2, 3, 4]")?
}
- array pattern支持
[a, .. as rest, b]
形式,其中rest
会绑定到一个VecView,例如:
test "view_pattern" {
fn is_palindrome(s: VecView[Int]) -> Bool {
match s {
[] => true
[_] => true
[x, .. as rest, y] => x == y && is_palindrome(rest)
}
}
let v1 = Vec::[1, 2, 3, 4, 5]
@assertion.assert_false(is_palindrome(v1[..]))?
let v2 = Vec::[1, 2, 3, 2, 1]
@assertion.assert_true(is_palindrome(v2[..]))?
}
- 标签参数调用时允许省略标签里的波浪线
~
,例如:
inspect(1, content="1")
- 构造器支持带标签的参数:
pub enum Tree[X] {
Nil
Branch(X, ~left : Tree[X], ~right : Tree[X])
}
pub fn leftmost[X](self : Tree[X]) -> Option[X] {
loop self {
Nil => None
// 使用 `label=pattern` 来匹配构造器的带标签参数
Branch(top, left=Nil, right=Nil) => Some(top)
// `label=label` 可以简写成 `~label`
Branch(_, left=Nil, ~right) => continue right
// 可以用 `..` 来忽略所有剩余的带标签参数
Branch(_, ~left, ..) => continue left
}
}
fn init {
// 创建带标签的构造器的语法和调用带标签的函数一样
let t: Tree[Int] = Branch(0, right=Nil, left=Branch(1, left=Nil, right=Nil))
println(t.leftmost()) // `Some(1)`
}
- 可选参数的默认值可以依赖前面的参数,例如:
fn f(~x: Int = 1, ~y: Int = x) -> Int {
x + y
}
- Byte字面量支持八进制转义。
IDE更新
- IDE 支持本地环境的 test codelens;支持expect test的自动更新。
-
修复在线 IDE 在 Windows 上找不到 core 的问题。
-
支持识别
test_import
和*_test.mbt
文件。