MoonBit 周报 Vol.53:新增高级循环语法、引入字符串插值、MoonBit AI 支持代码解释!

news/2025/1/15 17:09:50/

weekly 2024-08-05

MoonBit_2">MoonBit更新

  • 添加了基于 IterIter2 类型的 for .. in 循环支持:
fn main {for x in [ 1, 2, 3 ] {println(x)}for k, v in { "x": 1, "y": 2 } {println("\{k} => \{v}")}
}

forin 之间可以使用 1~2 个变量来绑定 Iter 中的元素。有一个变量的 for x in expr1 循环会遍历 expr1.iter() : Iter[_],有两个变量的 for x, y in expr2 循环会遍历 expr2.iter2() : Iter2[_, _] 中的元素。可以使用下划线代替变量来忽略元素,但不能在 forin 之间使用模式匹配。

for .. in 循环的循环体中,可以使用 return/break/raise 等控制流:

test "for/in" {// 数组的 `iter2` 方法会遍历 index + 元素for i, x in [ 1, 2, 3 ] {assert_eq!(i + 1, x)}
}
  • 引入新的字符串插值语法:\{},旧的语法\()已弃用,允许更复杂的表达式直接嵌入字符串。
    未来会放松字符串插值内的语法限制,例如支持\{1 + 2}\{x.f(y)}
"hello, \(name)!" // warning: deprecated
"hello, \{name}!" // new syntax
  • 数值处理拓展:增加了新的内建类型BigInt,用于处理超出普通整数范围的大数值。
// BigInt 字面量以 N 结尾
let num = 100000000N // 与 Int 字面量类似,数字间允许下划线。同样支持 16 进制、8 进制、2 进制表示
let n2 = 0xFFFFFFFFN
let n3 = 0o77777777N
let n4 = 0b1111111100000000N
let n5 = 1234_4567_91011N// 当明确是一个 BigInt 类型时,字面量不用加 N 后缀
let n6 : BigInt = 1000000000000000000 //模式匹配也支持`BigInt`:match 10N {1N => println(1)10N => println(10)100 => println(100)
}
  • 支持了 enum 形式的错误类型声明,比如 Json 包中的错误类型可以如下声明:
pub type! ParseError {InvalidChar(Position, Char)InvalidEofInvalidNumber(Position, String)InvalidIdentEscape(Position)
} derive(Eq)

此外,labeled argumentmutable argument 也可以在 enum 形式的错误类型中使用,使用方式与普通的 enum 类型一致,比如:

type! Error1 {AB(Int, ~x: String)C(mut ~x: String, Char, ~y: Bool)
} derive(Show)fn f() -> Unit!Error1 {raise Error1::C('x', x="error2", y=false)
}fn g() -> Unit!Error1 {try f!() {Error1::C(_) as c => {c.x = "Rethrow Error2::C"raise c}e => raise e}
}fn main {println(g?()) // Err(C(x="Rethrow Error2::C", 'x', y=false))
}
  • 添加了 catch! 语法,用于在 error handler 中将未处理的错误重新抛出,以简化错误处理,比如上面例子中的函数 g 可以重写为:
fn g() -> Unit!Error1 {try f!() catch! {Error1::C(_) as c => {c.x = "Rethrow Error2::C"raise c}}
}
  • 移除了 JavaScript 后端生成的代码对 TextDecoder API 的依赖。随着 Node.js 对 TextDecoder 的支持变得更完善,我们未来仍然可能会考虑在项目中引入和使用 TextDecoder

IDE 更新

  • 修复在 web 版 vscode 插件上调试时无法加载核心库 core 中的源码问题,现在 MoonBit IDE上的调试功能已恢复可用。

  • IDE 支持在模式匹配中根据类型对构造器进行补全:

match (x : Option[Int]) {// ^^^^ 这里会补全 `None` 和 `Some`
}

标准库更新

  • 新增 Iter2 类型,用于遍历有两个元素的集合,例如 Map,或是带着 index 遍历数组:
fn main {let map = { "x": 1, "y": 2 }map.iter2().each(fn (k, v) {println("\{k} => \{v}")})
}

Iter[(X, Y)] 相比,Iter2[X, Y] 有更好的性能,并且有 for .. in 循环的原生支持。

  • @json.JsonValue 类型被移动到 @builtin 包中,并重命名为 Json@json.JsonValue 现在是以 Json 的一个类型别名,所以这一改动是向后兼容的。

  • @builtin 中添加了 ToJson 接口,用于表示可以被转换为 Json 的类型。

构建系统更新

  • moon check|build|test 添加 -C/--directory 命令,与 --source-dir 参数等价,用于指定 MoonBit 项目的根目录,也即 moon.mod.json 所在目录。

  • 修改 moon.mod.json 中的 root-dirsource,这个字段用于指定模块的源码目录,source 字段的值也可以是多层目录,但是必须为 moon.mod.json 所在目录的子目录,例如:“source”: “a/b/c”。

    引入该字段的目的是因为 MoonBit 模块中的包名与文件路径相关。例如,如果当前模块名为 moonbitlang/example,而其中一个包所在目录为 lib/moon.pkg.json,那么在导入该包时,需要写包的全名为 moonbitlang/example/lib。有时,为了更好地组织项目结构,我们想把源码放在 src 目录下,例如src/lib/moon.pkg.json,这时需要使用 moonbitlang/example/src/lib 导入该包。但一般来说我们并不希望 src 出现在包的路径中,此时可以通过指定"source": "src"来忽略src这层目录,便可仍然使用 moonbitlang/example/lib 导入该包。

工具链更新

  • MoonBit AI 增加explain新功能:点击 MoonBit 图标,选择 /explain 来解释代码。代码的解释会出现在右侧。代码生成完以后,可以通过点击👍/👎给我们关于生成质量上的反馈。

在这里插入图片描述


http://www.ppmy.cn/news/1508827.html

相关文章

SuccBI+低代码文档中心 — 可视化分析(仪表板)(上)

有关仪表板的设计器: 查询设置 由于仪表板的设计器是所见即所得的,可以将当前制作的内容和数据的查询结果实时展示在界面中,当引入到仪表板的模型数据量较大时,为了提高设计器界面的查询性能,提供了以下两种方法&…

OpenCV图像滤波(15)梯度计算函数Scharr()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 函数使用 Scharr 运算符计算图像的第一个 x- 或 y- 空间导数。 调用 Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType) \texttt{Sc…

2015款到18款奔驰GLC升级为2021款的HU6主机后,实现了触摸屏人机交互和Carplay功能

奔驰GLC是北京奔驰生产的一款中型SUV。有车主将2015款奔驰GLC升级为2021款的HU6主机后,实现了触摸屏人机交互和Carplay功能。该车主分享了使用体验: • Carplay功能:可以直接在车机大屏幕上显示导航、音乐和电话信息,让用户在开车…

[Linux] LVM挂载的硬盘重启就掉的问题解决

问题:系统重启后挂在逻辑卷的盘会掉(必现) 环境:SUSE Linux 11 SP4 原因:boot.lvm是关闭的 解决:boot.lvm设置开启 参考资料: linux下lvm状态Not avaliable问题排查及处理(常见Suse操作系统…

oracle 增删改查字段

在Oracle数据库中,对表字段的增删改查是数据库操作的基础。以下是关于Oracle中如何增加、删除、修改和查询字段的详细解释: 1. 增加字段(Add) 增加字段的语法为: ALTER TABLE 表名 ADD (字段名 数据类型 [DEFAULT 默…

【设计模式】六大基本原则

文章目录 开闭原则里氏替换原则依赖倒置原则单一职责原则接口隔离原则迪米特原则总结 开闭原则 核心就一句话:对扩展开放,对修改关闭。 针对的目标可以是语言层面的类、接口、方法,也可以是系统层面的功能、模块。当需求有变化的时候&#…

opencv-python图像增强二:图像去雾(暗通道去雾)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、简介:二、暗通道去雾方案简述:三、算法实现步骤3.1最小值滤波3.2 引导滤波3.3 计算图像全局光强 四:整体代码实现五&#xf…

【mysql 第三篇章】一条 update语句是怎么持久化到磁盘上的?

首先看一下这个 SQL 语句你会不会写? 下面是说明执行这个 SQL 语句,数据库底层做了什么操作。 update users set namexxx where id10;在引擎要执行更新语句的时候,比如更新 id10 这行数据时,他会先查看数据在缓冲池中是否存在,如…