查看原文
科技

MoonBit 周报 Vol.38:零开销迭代,动态数组模式匹配完美支持

MoonBit 运营组 MoonBit 2024-04-22




-- 更新目录 --


1/ 标准库新增Iter类型与VecView类型

2/ 构造器支持带标签的参数

3/ IDE支持本地环境的test codelens

4/ array pattern支持[a, .. as rest, b]形式

5/ moon test添加测试过滤相关选项

6/ 标签参数调用时允许省略标签里的波浪线~

7/ 矩阵函数不再显示inlay hint



01MoonBit 更新

1.  标准库新增 Iter 类型


该类型可以高效地对容器中的元素的进行访问,并且将访问过程优化成循环,使用方式如下:

test "iter" {
  let sum = Iter::[123456]
  .filter(fn { x => x % 2 == 1 })
  .take(2)
  .map(fn { x => x * x})
  .reduce(fn (x, y) { x + y }, 0)
  inspect(sum, content="10")?  
}


2. 标准库新增 VecView 类型


可以使用如下方式对 Vec[T] 类型的值取它的 VecView[T],例如:

test "view" {
  let v = Vec::[12345]
  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]")?
}

3. 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::[12345]
  @assertion.assert_false(is_palindrome(v1[..]))?
  let v2 = Vec::[12321]
  @assertion.assert_true(is_palindrome(v2[..]))?
}


4. 标签参数调用时允许省略标签里的波浪线 ~


例如:

inspect(1, content="1")


5. 构造器支持带标签的参数


    例如:

    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)`
    }

      6. 可选参数的默认值可以依赖前面的参数


      例如:

      fn f(~x: Int = 1, ~y: Int = x) -> Int {
        x + y
      }


      7. Byte 字面量支持八进制转义


        02IDE 更新

        1. IDE 支持本地环境的 test codelens

        目前本地环境已支持 expect test 的自动更新,效果如下:

        2. 修复在线 IDE 在 Windows 上找不到 core 的问题

        3. 支持识别 test_import 和 *_test.mbt 文件

        03MoonBit 更新

        1. 优化 moonfmt


          • 修复了StringChar字面量中的转义序列没有被正确格式化的问题

          • 调整针对{ ..record }的格式化

          2. moon info 和 moon coverage 现已支持 Windows


          3. moon info 支持在不引起歧义时缩短类型名称,使得生成结果更加干净


            • 在没有同名类型定义的时候隐藏 builtin 的包名前缀

            • 在没有歧义时使用包名的最后一部分代替完整的包名


            更新前:
            package moonbitlang/core/map

            // -- snip --

            type Map
            fn Map::debug_write[K : @moonbitlang/core/builtin.Debug, V : @moonbitlang/core/builtin.Debug](Map[K, V], @moonbitlang/core/builtin.Buffer) -> Unit
            fn Map::keys_set[K : @moonbitlang/core/builtin.Compare + @moonbitlang/core/builtin.Eq, V](Map[K, V]) -> @moonbitlang/core/immutable_set.ImmutableSet[K]
            fn Map::lookup[K : @moonbitlang/core/builtin.Compare + @moonbitlang/core/builtin.Eq, V](Map[K, V], K) -> Option[V]
            fn Map::to_vec[K, V](Map[K, V]) -> @moonbitlang/core/vec.Vec[Tuple[K, V]]


            更新后:

            package moonbitlang/core/map

            alias @moonbitlang/core/immutable_set as @immutable_set
            alias @moonbitlang/core/vec as @vec

            // -- snip --

            type Map
            fn Map::debug_write[K : Debug, V : Debug](Map[K, V], Buffer) -> Unit
            fn Map::keys_set[K : Compare + Eq, V](Map[K, V]) -> @immutable_set.ImmutableSet[K]
            fn Map::lookup[K : Compare + Eq, V](Map[K, V], K) -> Option[V]
            fn Map::to_vec[K, V](Map[K, V]) -> @vec.Vec[Tuple[K, V]]

            04构建系统更新

            1. moon test 添加测试过滤相关选项:
              -p, --package <PACKAGE_NAME>  Run test in the specified package
              -f, --file <FILE>             Run test in the specified file, only valid when --package is specified
              -i, --index <INDEX>           Run the index-nth test in the specified file, only valid when --file is specified


              命令示例:moon test -p username/hello/A -f hello.mbt -i 0 (运行username/hello/A包中hello.mbt文件中的第0 个 test block);-f -i 分别在指定 -p-f 时才有效;如果不指定 -f 则运行 -p 指定包中所有测试,不指定 -i 则运行 -f 指定文件中所有测试


              2. moon check|build|test 添加 --sort-input 选项


              --sort-input 选项用于生成稳定的构建顺序。


              3. expect test 生成的 ~content= 省略 ~,变更为 content=


              05MoonBit 团队成员在 LLM4 Code 2024 会议发表演讲

              最近,MoonBit 团队的研究论文《MoonBit: Explore the Design of an AI-Friendly Programming Language》荣幸地被 2024 年 LLM4Code 会议接收!4月20日(上周六),MoonBit 团队成员在会议上展示了 MoonBit 在 LLM(大语言模型)代码生成设计编程语言(PL)方面的工作。想了解更多详细内容点击https://conf.researchr.org/program/icse-2024/program-icse-2024/?track=LLM4Code


              官方平台账号,欢迎扫码关注


              MoonBit


              官网|moonbitlang.cn知乎|@张宏波 / @MoonBit小红书|MoonBit月兔
              Twitter丨@MoonbitlangBilibili丨MoonBit月兔MoonBit用户交流群|添加小助手moonbit_helper



                 ⬇点击阅读原文 

                 下载 MoonBit,开启 MoonBit 语言新体验


              继续滑动看下一个
              向上滑动看下一个

              您可能也对以下帖子感兴趣

              文章有问题?点此查看未经处理的缓存