weekly 2024-04-01
MoonBit 更新
1. expect 测试添加 inspect 函数
expect 测试添加针对 Show 接口的 inspect 函数,签名如下:
pub fn inspect(
obj: Show,
~content: String = "",
~loc: SourceLoc = _,
~args_loc: ArgsLoc = _
) -> Result[Unit, String]
⚠️ 此API暂不稳定,在未来可能会更改为 expect 函数
使用 inspect
可以更方便编写测试,例如对于如下代码:
fn add(x: Int, y: Int) -> Int {
x + y
}
test {
inspect(add(1, 2))?
}
test {
(add(3, 4) |> inspect)?
}
执行 moon test -u
之后,文件被自动更新为:
fn add(x: Int, y: Int) -> Int {
x + y
}
test {
inspect(add(1, 2), ~content="3")?
}
test {
(add(3, 4) |> inspect(~content="7"))?
}
2.编译器内置函数迁移到标准库
把原本的在编译器内部的一些基础的 MoonBit 定义迁移到了标准库中。在线IDE上也可以使用标准库了
3. 支持 alert pragam
MoonBit 现在支持在顶层的文档注释中书写多个 pragam。所有的 pragam 以@
开头,并且独占一行。
目前支持函数和方法的 alert pragma,当被标记了 alert 的函数和方法被使用时会产生警告。这个机制可以用来标记已经弃用或者不安全的函数。alert pragma 的格式为@alert id "explain string"
,其中id可以是任意的标识符。
4. 支持在 pragma 中标注 intrinsic
比如标准库中的如下代码在被标注 intrinsic 之后,在 JavaScript 后端会使用 String(..)
函数来将浮点数转化为字符串,后续会加入更多函数的 intrinsic 支持。
/// @intrinsic %f64.to_string
pub fn to_string(self : Double) -> String {
double_to_string(self)
}
5. 生成代码性能和体积的改进
- 引入了消除局部 alias 的优化,从而避免生成无用的局部变量
- 引入了常量传播的优化
- 优化了生成的 wasm 代码中类型声明的部分,减少了冗余的类型声明