双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

更新目录

· 模式匹配支持守卫

· LLVM 后端发布

· 弃用了通过方法隐式实现 trait 的行为

· 支持 Attribute 语法

·enum支持自定义 tag 值

MoonBit 更新

**1. 模式匹配支持守卫 **(Pattern Guard)****

**

模式守卫可以通过在模式后追加if ...的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式,并且模式守卫为真的情况下才会执行。如果模式守卫为假,则会继续向下寻找能够被匹配的分支。

这个特性能够简化许多使用模式匹配的代码,以化简算术表达式为例:

scss 复制代码
fn simplify(e : Expr) -> Expr {
  match e {
    Add(e1, Lit(0)) => e1
    Sub(e1, e2) if e1 == e2 => Lit(0)
    //          ^^^^^^^^^^^ pattern guard
    _ => e
  }
}

模式守卫还可以配合is表示式使用来引入新的变量,例如:

scss 复制代码
fn json_get_key(json : Json, key : String) -> Json! {
  match json {
    Object(map) if map[key] is Some(value) => value
    _ => fail!("key not found: {key}")
  }
}

**

**

2. 支持 Attribute 语法

用来代替原有的@alert deprecated "message"等 pragmas。每个 attribute 单独占用一行,attribute 内不允许换行。

目前支持的attribute:

  • #deprecated("message"):声明该函数为 deprecated ,并且在使用处提示 message 中的内容。

  • #coverage.skip:声明该函数不计入覆盖率测试。

我们后续将会移除旧的 pragmas 语法。

arduino 复制代码
#deprecated("use function g instead")
#coverage.skip
fn f() -> Unit {
  ...
}

**

**

3. Bytes 类型支持使用字符串字面量进行初始化和赋值

该字符串会以 UTF-8 编码的形式存储为一个 Bytes 。例如:

ini 复制代码
fn main {
  let xs : Bytes = "123"
  let ys : Bytes = "你好,世界"
}

4. enum支持自定义 tag 值

这在绑定 Native 的 C FFI 时非常有用。以open这个 syscall 为例:

ini 复制代码
enum OpenFlag {
  O_RDONLY = 0x00
  O_WRONLY = 0x01
  O_RDWR   = 0x02
}

extern "c" fn open(path : Bytes, flag : OpenFlag) -> Int = "open"

test {
  let path : Bytes = "tmp.txt"
  let fd = open(path, O_RDONLY)
}

**

**

5. 增强常量( const )声明的表达能力,支持:

**

**

  • 引用其他常量
  • 内建类型的其四则运算、位运算和比较运算****

**

**

例如:

ini 复制代码
const A : Int = 1 + 2 * 3
const B : Int = A * 6

6. 弃用了通过方法隐式实现 trait 的行为

如果需要为一个类型实现一个 trait ,需要通过显示的impl构造来实现。

rust 复制代码
// 为 T 隐式实现 Show (deprecated)
fn T::output(self : T, logger : &Logger) -> Unit {
  ...
}

// 你应该迁移到如下的显示实现
impl Show for T with output(Self : T, logger : &Logger) -> Unit {
  ...
}

**

**

7. 移除直接调用形如 fn T::f(..)的行为

该行为之前已通过警告的形式 deprecate。未来,形如fn f(self : T, ..)的方法可以当成普通函数使用,而形如fn T::f(..)的方法只能用T::f(..)的形式或x.f(..)语法调用。新语义的更多细节见 github.com/moonbitlang...

8. Native 后端的一部分 runtime 拆出来到单独的 C 文件里面

该 C 文件位于$MOON_HOME/lib/runtime.c。如果你使用了非标准的构建方式,比如自己通过调用 C 编译器编译生成出来的 C 文件,需要注意在编译的时候加入该 C 文件。

9. 我们在 bleeding 版本的工具链上面发布了我们的 LLVM 后端

目前我们的 LLVM 后端只支持了 x86_64 Linux 和 ARM64 macOS 平台。这两个平台上可以通过如下 bash 命令安装 bleeding 版本的 moon 。

bash 复制代码
curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash -s 'bleeding'

然后就可以在构建、测试和运行的时候,通过向 moon 传入--target llvm的选项来使用 LLVM 后端。例如:

css 复制代码
moon build --target llvm

构建系统更新*

1. 新增 moon check --explain

能够输出关于某个 error code 的详细信息

**

**

2. moon.pkg.json中新增 "native-stub"配置项

用来声明当前包用到的 C stub 文件。在构建时,这些 stub 会被构建并连接到当前包的产物中。如果你的项目是把 C stub 文件写在 cc-flags 中,现在可以将这些 C stub 文件声明在 "native-stub" 字段中

3.放松 moon publish必须要通过 moon check 的要求

如果 check 失败,会询问用户是否坚持发布。

IDE 更新*

1. Markdown 中内嵌的 MoonBit 代码块支持格式化

用户可以通过选择 MoonBit 插件来格式化含有 MoonBit 的 Markdown 。

相关推荐
威视锐科技1 小时前
软件定义无线电36
网络·网络协议·算法·fpga开发·架构·信息与通信
JINX的诅咒2 小时前
CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案
算法·数学建模·fpga开发·架构·信号处理·硬件加速器
二进制coder8 小时前
DFX架构详解:构建面向全生命周期的卓越设计体系
架构
Mia@9 小时前
网络通信&微服务
微服务·云原生·架构
Cloud_.12 小时前
用Nginx实现负载均衡与高可用架构(整合Keepalived)
nginx·架构·负载均衡·keepalived
Allen_LVyingbo14 小时前
文章配图新纪元:OpenAI新推出的GPT-4o原生图像生成功能启示
人工智能·学习·架构·数据分析·健康医疗
郭涤生14 小时前
第二章:ROS架构_《ROS机器人开发实践》_notes
架构·机器人
SimonKing14 小时前
Kafka 4.0.0震撼来袭,彻底摒弃Zookeeper
java·后端·架构
Java技术小馆14 小时前
在分布式系统中如何应对网络分区
java·面试·架构
MaCa .BaKa14 小时前
27-衣橱管理系统(小程序)
java·vue.js·spring boot·小程序·架构·uni-app·maven