双周报Vol.66: String模式匹配增强、while条件支持使用 is 表达式、新增IDE安装器...多项核心技术更新!

news/2025/2/26 5:52:41

2025-02-24

MoonBit__2">MoonBit 更新

String 模式匹配增强

  • 支持在 Array pattern 中使用字符串字面量

    在类型为 String 的 Array pattern 中可以通过..操作符来匹配一段字符串:

let str = "https://try.moonbitlang.com"
match str {
  [.."https://", ..path] => println(path)
  [.."http://", ..path] => println(path)
  _ => println("unexpected protocol")
}

这相当于下面代码的简化版本:

 let str = "https://try.moonbitlang.com"
 match str {
   ['h', 't', 't', 'p', 's', ':', '/', '/', .. path] => println(path)
   ['h', 't', 't', 'p', ':', '/', '/', .. path] => println(path)
   _ => println("unexpected protocol")
 }
  • 支持在 Array pattern 中使用 const 常量
const HTTP = "http://"
const HTTPS = "https://"

///|
fn main {
  let str = "https://try.moonbitlang.com"
  match str {
    [..HTTP, .. path] => println(path)
    [..HTTPS, .. path] => println(path)
    _ => println("unexpected protocol")
  }
}

while 的条件中支持使用 is 表达式

fn main {
  let queue = @queue.of([1,2,3])
  while queue.pop() is Some(n) {
    println(n)
  }
}
// 输出:
// 1
// 2
// 3

数组字面量重载支持String类型

数组字面量重载支持String类型。

C FFI 处理的 Breaking Change

[BREAKING CHANGE] C FFI 中,所有 MoonBit 对象改为指向第一个字段而非对象头。在 MoonBit 原生后端中,为了支持垃圾回收,每个对象都有一个对象头(定义在 moonbit.h 中)。之前,原生后端中,所有 MoonBit 对象都是一个指向对象头的指针。但这意味着在绑定 C FFI 时,很多函数都需要写一些 C wrapper 来跳过对象头、获取实际的数据。为了改善 C FFI 的体验,我们将所有 MoonBit 对象改为指向对象头尾部、第一个字段开始位置的指针。这样一来,在绑定 C FFI 时,就无需显式处理对象头了。例如,现在在 C FFI 中,可以直接用 Bytes 来表示 const char*void*,用 FixedArray[T] 来表示 T*,无需再写 C wrapper 了。

不过,这一改动是对 C FFI 的 breaking change:现有的、跳过对象头的 C wrapper 需要进行适配。因此,使用了 C FFI 的库或程序应当在本次编译器更新后进行修改。

新增 FuncRef[T] 类型用于 FFI

moonbitlang/builtin 中新增了一个特殊类型 FuncRef[T],表示类型为 T 的、无捕获的函数。该类型的用途是绑定一些需要传递回调函数的 FFI,例如 Unix signal handler。创建 FuncRef[T] 的方式是:在预期类型为 FuncRef 的地方写一个无捕获的匿名函数即可。FuncRef[T] 是用于绑定 FFI 的,因此它无法直接被调用。

外部类型语法更新

用于 FFI 的外部类型的语法改为 extern type T:之前,如果要在 MoonBit 里定义一个外部类型,语法是 type T。接下来,我们将把定义外部类型的语法改为更显式的 extern type T。旧的 type T 语法被 deprecate,编译器会对旧语法发出警告。本次语法迁移可以使用 moon fmt 自动完成。

未来旧的 type T 语法彻底移除后,我们将把 type T 语法另外用作其他用途。extern type T 表示的是一个完全外部的对象,MoonBit 的垃圾回收系统对它不会做任何处理。而未来 type T 将表示一些来自外部、但有正常 MoonBit 对象结构、会被垃圾回收处理的对象。例如有自定义 finalizer 的、来自 FFI 的对象。

移除旧的 Trait 对象语法

移除了旧的trait object语法。之前编译器已经对旧的 trait object 语法汇报了 warning,现在旧的 trait object 语法 Trait 正式被移除,trait object 类型应当写成 &Trait

构建系统更新

  • moon info 支持使用--package参数来指定要处理的包

  • moon.pkg.json配置文件增加supported-targets字段,用于指定当前包所支持的后端(若若设置则默认支持所有后端)。当尝试在不支持的后端中构建这个包或者依赖包支持的后端与当前包不一致时,构建系统将报错。

  • moon.pkg.json增加native-stub字段,用于声明这个包中需要一起构建并链接的.c文件。

IDE 更新

  • 新增IDE安装器。对于 windows 桌面端,我们打包了集成moonbit插件的 IDE 安装器,可以通过 https://cli.moonbitlang.cn/vscode/latest/win32-x64-user.exe 下载并安装开发环境。

  • MoonBit 交互式教程 https://tour.moonbitlang.com 增加了中文版本
    在这里插入图片描述

  • 语言服务支持处理markdown中的moonbit代码。需要在markdown在最开始配置

---
moonbit: true
---

才会生效。
在这里插入图片描述


http://www.niftyadmin.cn/n/5868106.html

相关文章

无人系统:未来技术的自动化与智能化应用

随着技术的不断发展,无人系统(Unmanned Systems)作为一类智能化、高效能的自动化设备,已经在多个领域得到了广泛应用。无人系统是指能够自主或通过远程控制执行任务的设备,它们能够代替人类完成高风险或重复性工作&…

MySQL 入门“鸡”础

一、Win10 与Ubuntu安装 以下是一篇针对 Ubuntu 安装 MySQL 的过程中写的示例: --- # Ubuntu 安装 MySQL 详细指南 在本教程中,我们将向您展示如何在 Ubuntu 上安装 MySQL,并完成基本的安全配置。以下是具体步骤: # 1. 安装 …

ubuntu22.04 如何扩根目录空间,当空间不够时

根目录没扩容之前的空间,只有24G 8、使用 lsblk 查看新硬盘是否被系统识别,如果没有识别请重启虚拟机 9、对新添加的硬盘进行分区 fdisk /dev/sdb 在 command 输入 m 进行帮助 n   增加一个新分区e 扩展分区p 主…

Flink 中的滚动策略(Rolling Policy)

在 Apache Flink 中,滚动策略(Rolling Policy)是针对日志(或数据流)文件输出的一种管理策略,它决定了在日志文件的大小、时间或其他条件满足特定标准时,如何“滚动”生成新的日志文件。滚动策略…

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术,旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo,是真正拉低LLM的学习门槛,让每个人都能从理解每一行代码, 从零开始亲手训练一个极小的语言模型。开源地址: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小时…

Java 接收 XML 格式参数并转换为 JSON

在 Java 应用程序中&#xff0c;处理 XML 数据并将其转换为 JSON 格式是很常见的任务。以下是一个示例代码&#xff0c;展示如何使用 Java 完成这一操作&#xff1a; 前期准备 确保你的项目中包含以下依赖&#xff1a; <dependency><groupId>com.fasterxml.jack…

C++之vector和list辨析

std::vector 和 std::list 是 C 标准库中两种常用的容器&#xff0c;它们都用于存储和管理元素集合&#xff0c;但在底层实现和性能特性上有显著的区别。 1. 底层实现 std::vector: 基于动态数组实现。元素在内存中是连续存储的。支持随机访问&#xff08;通过下标访问元素&a…