月报 Vol.04 : 新增 async test 与 async fn main 语法,新增 lexmatch 表达式

对应moonc版本:v0.6.29

语言更新

  • 新增async test 与 async fn main 语法, 支持异步测试与异步主函数。async fn main 和 async test 基于 moonbitlang/async 库,目前支持 Linux/MacOS 上的 native 后端。关于 MoonBit 异步编程的更多信息见moonbitlang/async 的文档和 GitHub 仓库。async test 声明的异步测试会并行地运行:
rust 复制代码
    ///|

    async test "http request" {

      let (response, result) = @http.get("https://www.example.org")

      inspect(response.code, content="200")

      assert_true(result.text().has_prefix("<!doctype html>"))

    }
  • 新增lexmatch表达式(实验性特性)。提供了用正则表达式对StringView或BytesView进行模式匹配的能力。下面这个例子匹配2到4个连续的字符'a'以及紧随其后的字符'b', 并将连续的'a'捕获为变量a。更具体的使用方式可参考 moonbitlang/parser 中的 lexer.mbt 和 moonbit-evolution 中的 lexmatch 提案。
rust 复制代码
    lexmatch x with longest {

      (("a{2,4}" as a) "b", _) => Some(a.length())

      _ => None

    }
  • 新增using语法,统一了 fnalias、traitalias 和简单 typealias。在导入类型和 trait 时,需要在名称前添加对应的关键字:
rust 复制代码
    using @pkg {

      value,

      CONST,

      type Type,

      trait Trait,

    }

另外,也可以使用 pub using 实现 re-export 的效果,将其他包的定义在当前包重新导出。未来,fnalias、traitalias 和简单 typealias 语法将会被废弃,给外部定义创建别名的功能会被 using 代替,给当前包的定义创建别名的功能由 #alias 属性代替

  • trait 中的方法支持可选参数:
rust 复制代码
    pub(open) trait Reader {

      async read(Self, buf : FixedArray[Byte], offset? : Int, len? : Int) -> Unit

    }

可选参数的默认值由每个 impl 各自决定,不同的 impl 可以设置不同的默认值,或者直接不提供默认值(此时可选参数在 impl 内部的类型会是 T?,None 表示用户没有提供这个参数)

  • 支持使用 #alias 来重载 op_get 等运算符,相比 op_xxx 可读性更好。目前支持下列操作符:
rust 复制代码
    // 对应之前的 `op_get`

    #alias("_[_]")

    fn[X] Array::get(self : Array[X], index : Int) -> X { ... }

   

    // 对应之前的 `op_set`

    #alias("_[_]=_")

    fn[X] Array::set(self : Array[X], index : Int, elem : X) -> Unit { ... }

   

    // 对应之前的 `op_as_view`

    #alias("_[_:_]")

    fn[X] Array::view(

      self : Array[X],

      start? : Int = 0,

      end? : Int = self.length(),

    ) -> ArrayView[X] { ... }

这里,实际的实现的名字(上面的 get/set/view)可以随意设置,只需要写上对应的 #alias,就可以完成运算符重载。我们推荐使用 #alias 代替 op_xxx 来进行基于方法的运算符重载(+ 等运算符是通过 trait 重载的,不受影响)

  • 一些已经废弃较长时间的语法和行为被正式移除:
  • 过去,用 fn meth(self : T, ..) 形式定义的方法,既是方法也是函数,可以直接当作普通函数使用。这一行为已经废弃较长时间,编译器会提供警告。现在,这一行为被正式移除。用 fn meth(self : T, ..)现在等价于 fn T::meth(self : T, ..)。未来,self 形式的方法定义本身也可能被废弃

  • moon.pkg.json 中的 direct_use 字段被正式移除,由 using 代替

工具链更新

  • 发布了wasm版工具链, x86 Darwin与 arm Linux用户可使用:www.moonbitlang.cn/blog/moonbi...

  • 我们为构建系统开发了一个实验性的新版本 (RR)。这一新版本拥有更高的性能和更好的可维护性,将会完全替代 moon 现在的内部实现,欢迎大家试用并寻找问题。可以使用环境变量 NEW_MOON=1 或者命令行参数 -Z rupes_recta 启用。如果遇到任何问题,请发在 github.com/moonbitlang... 上。

  • moon fmt支持对.mbt.md文件进行format

  • 新增moon info --no-alias ,在生成pkg.generated.mbti 文件时不显示类型别名

标准库更新

  • 为了应对潜在的 HashDos 攻击,Hash 的计算将会变为进程随机。目前 JS 后端已实现此修改。

  • ArrayView已改为不可变数据结构,用于统一对Array FixedArray ImmutArray取切片。

相关推荐
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
学长毕设3 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒4 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
captain3766 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
wflynn6 小时前
GitHub 今日推荐|Edge0:让大号 MoE 模型在一台 Mac 上流式跑起来
python·开源·github
IT_陈寒8 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
泡海椒8 小时前
05-雷达图多维画像-信用评级多维画像
后端
王中阳Go8 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型
大哥43098 小时前
Modbus 的"字序":一个配错就变成天文数字,或者干脆变成 0
后端
用户别睡觉8 小时前
五大 RAG 开源项目对比 2026:Dify、RAGFlow、FastGPT、AnythingLLM、LightRAG
github